Domanda

Ho un JComboBox che deve essere disabilitato a un certo punto, ma mi sento che lo status disabled lo rende molto più difficile da leggere perché il basso contrasto che ha.

Sarebbe bello se solo il pulsante freccia a discesa sarebbe stata mostrata come disabili, pur mantenendo il renderer scatola come se fosse attivato.

Effettivo: combo reale desiderata: risultato desiderato

C'è un modo semplice per ottenere questo o qualcosa di simile?

Grazie!

È stato utile?

Soluzione

Ho finito per sbirciare il BasicComboBoxUI, dove ho trovato questo:

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

Così ho usato come componente di un renderer JLabel con il metodo setForeground sovrascritto di non fare nulla. Così, il colore non è mai cambiato e mantiene il valore del nero di default.

Il problema è che questo trucco è l'attuazione specifica. Un dato Look & Feel o UI Manager potrebbe fare altre cose come sovraverniciatura con uno strato semi-trasparente per visualizzare gli elementi con disabilità, invece di cambiare i colori del componente: - (

Forse un test potrebbe almeno dare un avviso se il L & F o UI Manager installato non chiamano il metodo setForeground.

Altri suggerimenti

Questa è un'altra opzione di avere:

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

Sarà solo bisogno di aggiungere questo codice dopo la creazione di un'istanza. Le lettere saranno sempre nero. La casella combinata telaio si rivelerà essere o grigio o nero se disattivare o attivare.

Si guardano in questo modo:

entrare descrizione dell'immagine qui

Ecco un altro hack, a causa di Michael Grimes , che non dovrebbe essere influenzata dalla particolare aspetto . Il trucco è quello di rendere la casella combinata modificabile; la JTextField che viene esposto come l'editor supporta il metodo setDisabledTextColor. E dal momento che si sta disattivando la casella combinata, non importa che sia modificabile! Il codice che sto usando per fare questo (tradotto da Scala) è il seguente:

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

Il cast è garantito per avere successo qui perché stiamo usando un BasicComboBoxEditor , i cui documenti dire 'L'editor è implementato come un JTextField.' La linea ha commentato-out si verifica perché sto utilizzando un renderer personalizzato che consente di stampare interi con testo in più che li circonda; chiamando setItem mi permette di specificare una stringa simile, ed è necessario perché l'editor ignora il renderer personalizzato. Se si sta utilizzando il renderer di default, quindi non è necessario preoccuparsi di quella linea; d'altra parte, se si sta utilizzando un renderer più complicato, quindi potrebbe essere necessario fare qualcosa di completamente diverso.

Nonostante il fatto che questo è un ripiego orribile, è lavori , e non sembra fare affidamento su tutte le funzioni di implementazione definita. I due luoghi ho potuto immaginare questa rottura sono (a), se una casella combinata modificabile appare molto diverso da un uno non modificabile (per esempio, il mio primo tentativo non ha modificato il colore del campo di testo di sfondo, che lo rendevano sbagliato) o (b) se BasicComboBoxEditor smesso di restituire un JTextField (che sembra meno probabile). Ma finora, è servire i miei scopi.

Prova questo **

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

**

Il risultato può essere raggiunto con il seguente codice:

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

non ho la prova con diversi L & F, ma potrebbe fare la differenza, in quanto questo genera un evento PropertyChange ( "disabledTextColor"). Si prega di consultare la docs .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top