Pregunta

Tengo un JCombobox que necesita ser discapacitado en algún momento, pero siento que el disabled El estado hace que sea bastante difícil de leer porque el bajo contraste que tiene.

Sería bueno si solo el botón de flecha desplegable se mostraría como deshabilitado, mientras mantiene el renderizador de la caja como si estuviera habilitado.

Actual: actual combo Deseado: desired result

¿Hay una manera fácil de lograr esto o algo similar?

¡Gracias!

¿Fue útil?

Solución

He terminado asomando el BasicComboBoxui, donde encontré esto:

        if ( comboBox.isEnabled() ) {
            c.setForeground(comboBox.getForeground());
            c.setBackground(comboBox.getBackground());
        }
        else {
            c.setForeground(DefaultLookup.getColor(
                     comboBox, this, "ComboBox.disabledForeground", null));
            c.setBackground(DefaultLookup.getColor(
                     comboBox, this, "ComboBox.disabledBackground", null));
        }

Así que he usado como componente de renderizador un jlabel con el setForeground Método de anulación de no hacer nada. Por lo tanto, el color nunca cambia y mantiene el valor negro predeterminado.

El problema es que este truco es específico de la implementación. Una apariencia y el gerente de la UI dada puede hacer otras cosas como pintar demasiado con una capa semitransparente para mostrar elementos deshabilitados en lugar de cambiar los colores del componente :-(

Tal vez una prueba podría al menos dar una advertencia si el administrador de L&F o UI instalado no llame al setForeground método.

Otros consejos

Aquí hay otra opción que tienes:

    jComboBox1.setRenderer(new DefaultListCellRenderer() {
        @Override
        public void paint(Graphics g) {
            setForeground(Color.BLACK);
            super.paint(g);
        }
    });

Solo necesitará agregar este código después de la instancia. Las cartas siempre permanecerán negras. El marco de la caja combinada se convertirá en gris o negro si desactiva o habilita.

Se ven así:

enter image description here

Aquí hay otro truco, Debido a Michael Grimes, que no debería verse afectado por la apariencia particular. El truco es hacer que la caja combinada sea editable; la JTextField que está expuesto cuando el editor admite el setDisabledTextColor método. Y dado que estás deshabilitando la caja combinada, ¡no importa que sea editable! El código que estoy usando para hacer esto (traducido de Scala) es el 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);

Se garantiza que el elenco tendrá éxito aquí porque estamos usando un BasicComboBoxEditor, cuyos documentos dicen "El editor se implementa como un JTextfield". La línea comentada ocurre porque estoy usando un renderizador personalizado que imprime enteros con texto adicional que los rodea; vocación setItem Me permite especificar una cadena similar y es necesario porque el editor ignora el renderizador personalizado. Si está utilizando el renderizador predeterminado, entonces no necesita preocuparse por esa línea; Por otro lado, si está utilizando un renderizador más complicado, es posible que deba hacer algo por completo.

A pesar del hecho de que este es un Kludge horrible, obras, y no parece confiar en ninguna característica definida por implementación. Los dos lugares 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 parecer mal) , o (b) si BasicComboBoxEditor Dejó de devolver un JTextField (que parece menos probable). Pero hasta ahora, está sirviendo a mis propósitos.

Prueba esto **

UIManager.put( "ComboBox.disabledBackground", new Color(212,212,210) );
UIManager.put( "ComboBox.disabledForeground", Color.BLACK );

**

El resultado se puede lograr con el siguiente código:

    Component editorComponent = comboBox.getEditor().getEditorComponent();
    if(editorComponent instanceof JTextComponent){
        ((JTextComponent)editorComponent).setDisabledTextColor(Color.black);
    }

No lo probé con varios L&F, pero podría marcar la diferencia, ya que esto dispara un evento de cambio de propiedad ("DisabledTextColor"). Por favor vea el documentos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top