Question

J'ai un JComboBox qui doit être désactivé à un moment donné, mais je me sens que le statut de disabled rend très difficile à lire parce que le faible contraste qu'il a.

Ce serait bien si seul le bouton déroulant flèche sera affiché comme désactivé, tout en gardant la boîte renderer comme si elle était activée.

Actual: combo réelle souhaité:

Y at-il un moyen facile d'y parvenir ou quelque chose de similaire?

Merci!

Était-ce utile?

La solution

J'ai fini par jeter un oeil à la BasicComboBoxUI, où je l'ai trouvé ceci:

        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));
        }

Je l'ai utilisé en tant que composant un JLabel avec renderer la méthode setForeground overriden de ne rien faire. Ainsi, la couleur ne change jamais et conserve la valeur par défaut noir.

Le problème est que cette astuce est spécifique de mise en œuvre. Un look & feel ou l'interface utilisateur directeur donné peut faire d'autres choses comme surpeint d'une couche semi-transparente pour afficher les éléments désactivés au lieu de changer les couleurs du composant: - (

Peut-être un test pourrait au moins donner un avertissement si l'installation L & F ou l'interface utilisateur responsable ne remet pas la méthode setForeground.

Autres conseils

Voici une autre option que vous avez:

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

Vous aurez juste besoin d'ajouter ce code après l'instanciation. Les lettres resteront toujours noir. Le cadre de zone de liste déroulante tournera être gris ou noir si vous désactiver ou activer.

Ils ressemblent à ceci:

entrer image description ici

Voici une autre astuce, en raison de Michael Grimes , qui ne devrait pas être affectée par l'aspect particulier et la sensation . L'astuce est de rendre la zone de liste déroulante modifiable; la JTextField qui est exposée en tant qu'éditeur prend en charge le procédé de setDisabledTextColor. Et puisque vous êtes la désactivation de la zone de liste déroulante, il n'a pas d'importance que c'est modifiable! Le code que j'utilise pour ce faire (traduit de Scala) est le suivant:

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);

Le casting est garanti pour réussir ici parce que nous utilisons un

Essayer cette **

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

**

scroll top