Ecco un altro trucco, due to Michael Grimes, che non dovrebbe essere influenzata dalla particolare aspetto grafico. Il trucco è rendere la casella combinata modificabile; il JTextField
esposto come l'editor supporta il metodo setDisabledTextColor
. E dal momento che stai disattivando la casella combinata, non importa che sia modificabile! Il codice che sto usando per fare questo (tradotto da Scala) è la 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 è implementata come un JTextField. " La riga commentata si verifica perché sto utilizzando un renderer personalizzato che stampa interi con testo extra che li circonda; chiamare setItem
mi consente di specificare una stringa simile ed è necessario perché l'editor ignora il renderer personalizzato. Se stai usando il renderer predefinito, non devi preoccuparti di quella linea; d'altra parte, se stai usando un renderer più complicato, potresti dover fare qualcos'altro interamente.
Nonostante il fatto che si tratti di un orribile clandestino, lo funziona e non sembra fare affidamento su alcuna funzione definita dall'implementazione.I due punti in cui potrei immaginare questa rottura sono (a), se una casella combinata modificabile sembra molto diversa da una non modificabile (ad esempio, il mio primo tentativo non ha cambiato il colore di sfondo del campo di testo, il che ha fatto sembrare sbagliato) , o (b) se BasicComboBoxEditor
ha smesso di restituire un JTextField
(che sembra meno probabile). Ma finora, sta servendo i miei scopi.
fonte
2011-07-22 23:01:19
Purtroppo questo ha lo stesso inconveniente dell'altra soluzione, un gestore dell'interfaccia utente che utilizza una tecnica di paint-over per attenuare il componente darebbe comunque risultati insoddisfacenti. Inoltre, il metodo paint verrà chiamato più volte di "setForeground", quindi è apparentemente più efficiente lasciarlo invariato e sovrascrivere l'altro. – fortran
Non sembra esattamente il "desiderato"? –
Dove ho detto che non sarebbe stato corretto? Il problema è che ha lo stesso difetto della mia soluzione: dipende dall'implementazione. Un cambiamento nel modo in cui L & F o UI Manager raggiunge l'effetto disabilitato (ho già descritto un altro modo, ce ne sono altri) e poi è rotto. – fortran