Aquí hay otro truco, due to Michael Grimes, que no debe ser afectada por la particular mirada y sentir. El truco es hacer que el cuadro combinado sea editable; el JTextField
que está expuesto ya que el editor admite el método setDisabledTextColor
. Y como está deshabilitando el cuadro combinado, ¡no importa que sea editable! El código que estoy usando para ello (traducido del Scala) es la siguiente:
JComboBox cb = ...;
...
cb.setEditable(true);
ComboBoxEditor editor = cb.getEditor()
JTextField etf = (JTextField)etf.getEditorComponent()
etf.setDisabledTextColor(UIManager.getColor("ComboBox.foreground"));
etf.setBackground(UIManager.getColor("ComboBox.background"));
// editor.setItem(format(obj));
cb.setEnabled(false);
El elenco está garantizado para tener éxito aquí porque estamos usando un BasicComboBoxEditor
, cuyos documentos dicen "El editor se implementa como un JTextField ". La línea comentada se produce porque estoy usando un renderizador personalizado que imprime enteros con texto adicional que los rodea; Llamar al setItem
me permite especificar una cadena similar, y es necesaria porque el editor ignora el renderizador personalizado. Si está usando el renderizador predeterminado, entonces no necesita preocuparse por esa línea; por otro lado, si está usando un renderizador más complicado, entonces podría necesitar hacer algo completamente diferente.
A pesar del hecho de que este es un error horrible, funciona, y no parece depender de ninguna característica definida por la implementación.Los dos lugares en los que podría imaginar esta ruptura son (a) si un cuadro combinado editable se ve muy diferente de uno no editable (por ejemplo, mi primer intento no cambió el color de fondo del campo de texto, lo que lo hizo ver mal) , o (b) si BasicComboBoxEditor
dejó de devolver un JTextField
(lo que parece menos probable). Pero hasta ahora, está sirviendo a mis propósitos.
Lamentablemente, esto tiene el mismo inconveniente que la otra solución, un administrador de interfaz de usuario que utiliza una técnica de pintura para atenuar el componente todavía daría resultados insatisfactorios. Además, el método de pintura se llamará más veces que 'setForeground', por lo que es mucho más eficiente dejarlo sin modificar y sobrescribir el otro. – fortran
¿No se ve exactamente como el "deseado"? –
¿Dónde dije que no se vería correctamente? El problema es que tiene el mismo defecto que mi solución temporal: depende de la implementación. Un cambio en la forma en que L & F o UI Manager logra el efecto desactivado (ya lo describí de otra manera, hay más) y luego se rompe. – fortran