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: actual combo Gewünscht: desired result

Gibt es eine einfache Möglichkeit, dies oder ähnliches zu erreichen?

Vielen Dank!

War es hilfreich?

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:

enter image description here

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top