Bessere Lesbarkeit/Kontrast in einem behinderten jcombobox
-
26-10-2019 - |
Frage
Ich habe ein jcombobox, das irgendwann deaktiviert werden muss, aber ich fühle, dass das disabled
Der Status macht es ziemlich schwieriger zu lesen, weil der niedrige Kontrast er hat.
Es wäre schön, wenn nur die Taste des Dropdown-Pfeils als deaktiviert sein würde, während der Box-Renderer so bleibt, als ob er aktiviert wäre.
Tatsächlich: Gewünscht:
Gibt es eine einfache Möglichkeit, dies oder ähnliches zu erreichen?
Vielen Dank!
Lösung
Ich habe am Ende die Basiccomboboxui gepickt, wo ich das gefunden habe:
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));
}
Also habe ich als Renderer -Komponente ein JLabel mit dem verwendet setForeground
Methode überschreibt, nichts zu tun. Somit wird die Farbe nie geändert und hält den Standardschwarzwert.
Das Problem ist, dass dieser Trick implementierungsspezifisch ist. Ein bestimmtes Erscheinungsbild oder ein UI-Manager kann andere Dinge wie das Überlackieren mit einer halbtransparenten Ebene tun, um deaktivierte Elemente anzuzeigen, anstatt die Farben der Komponente zu ändern :-(
Vielleicht könnte ein Test zumindest eine Warnung geben, wenn der installierte L & F- oder UI -Manager das nicht anruft setForeground
Methode.
Andere Tipps
Hier ist eine weitere Option, die Sie haben:
jComboBox1.setRenderer(new DefaultListCellRenderer() {
@Override
public void paint(Graphics g) {
setForeground(Color.BLACK);
super.paint(g);
}
});
Sie müssen diesen Code nur nach der Instanziierung hinzufügen. Die Buchstaben werden immer schwarz bleiben. Der Kombinationsbox -Rahmen wird entweder grau oder schwarz, wenn Sie deaktivieren oder aktivieren.
Sie sehen so aus:
Hier ist ein weiterer Hack, Aufgrund von Michael Grimes, was nicht vom besonderen Erscheinungsbild beeinflusst werden sollte. Der Trick besteht darin, die Kombinationsbox editable zu machen. das JTextField
was ausgesetzt ist, wenn der Herausgeber die unterstützt setDisabledTextColor
Methode. Und da Sie die Kombinationsbox deaktivieren, spielt es keine Rolle, dass sie bearbeitbar ist! Der Code, den ich dazu benutze (übersetzt aus Scala), ist die folgende:
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);
Die Besetzung ist hier garantiert erfolgreich, weil wir a verwenden BasicComboBoxEditor
, dessen Dokumente sagen: "Der Herausgeber wird als JTextfield implementiert." Die kommentierte Zeile tritt auf, weil ich einen benutzerdefinierten Renderer verwende, der Ganzzahlen mit zusätzlichem Text umgeben. Berufung setItem
Ermöglicht mir, eine ähnliche Zeichenfolge anzugeben, und ist erforderlich, da der Editor den benutzerdefinierten Renderer ignoriert. Wenn Sie den Standard -Renderer verwenden, müssen Sie sich keine Sorgen um diese Zeile machen. Wenn Sie andererseits einen komplizierteren Renderer verwenden, müssen Sie möglicherweise etwas ganz anderes tun.
Trotz der Tatsache, dass dies ein schrecklicher Kludge ist, ist es dies Arbeiten, und es scheint nicht auf implementierungsdefinierte Funktionen zu stützen. Die beiden Orte, die ich mir vorstellen konnte, sind (a). Wenn eine bearbeitbare Kombinationskiste ganz anders aussieht als eine unveredelbare (zum Beispiel mein erster Versuch hat die Hintergrundfarbe des Textfelds nicht geändert, wodurch es falsch aussah). , oder (b) wenn BasicComboBoxEditor
hörte auf, a zurückzukehren JTextField
(was weniger wahrscheinlich scheint). Aber bisher dient es meine Zwecke.
Versuche dies **
UIManager.put( "ComboBox.disabledBackground", new Color(212,212,210) );
UIManager.put( "ComboBox.disabledForeground", Color.BLACK );
**
Das Ergebnis kann mit dem folgenden Code erzielt werden:
Component editorComponent = comboBox.getEditor().getEditorComponent();
if(editorComponent instanceof JTextComponent){
((JTextComponent)editorComponent).setDisabledTextColor(Color.black);
}
Ich habe es nicht mit mehreren L & F -L & F getestet, aber es könnte einen Unterschied machen, da dies ein PropertyChange -Ereignis ("DisabledTextColor") entfacht. Bitte sehen Sie sich ... an Dokumente.