JList.setEnabled(false) - Text soll nicht grau sein

Hag2bard

Bekanntes Mitglied
Guten Morgen,

ich habe eine JList, da diese einige Einträge aus einem String Array darstellen soll.
Da die Einträge nicht anklickbar sein sollen, habe ich die JList.setEnabled(false) gesetzt.
Natürlich habe ich dann dieses Erscheinungsbild:

1670573217569.png

Die Einträge sind ausgegraut. Ich möchte nun, dass der Text, der ja scheinbar die Farbe grau hat nun wieder schwarz ist.
Ich habe mit JList.setForeground(Color.BLACK) gearbeitet sowie den DefaultListCellRenderer der JList erweitert und dort setForeground(Color.BLACK) gesetzt.
Dies hatte auch keinen Effekt.

Ich habe geforscht, was die Methode setEnabled bewirkt, kann aber nicht rausfinden, an welcher Stelle eine disable JList die Farbe des Textes geändert wird.

Habt ihr einen Ansatz?
 
Der ListCellrenderer erstellt Labels, die er dann entsprechend der Liste auf Enabled oder Disabled setzt.
Du kannst einen eigenen ListCellRenderer erstellen, der sich zunächst den Eintrag des DefaultListCellRenderers holt, das erstellte Label auf enabled setzt. Damit wird die "Enabled" Farbe des Labels verwendet.

Java:
        jList1.setCellRenderer(new ListCellRenderer<String>() {
            DefaultListCellRenderer defaultRenderer = new DefaultListCellRenderer();

            @Override
            public Component getListCellRendererComponent(JList<? extends String> list, String value, int index, boolean isSelected, boolean cellHasFocus) {
                var label = (JLabel) defaultRenderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
                label.setEnabled(true);
                return label;
            }
        });


Alternativ kannst du auch die Farbe usw. manuell setzen oder die Eigenschaften der Disabled-Farbe über die Systemproperties ändern (bei Programmstart). Die sind allerdings je nach Look&Feel verschieden und wirken sich auf alle Labels aus.
"Label.disabledForeground"
"Label.disabledText"
Nicht mein Favorit



Wär's nicht vielleicht sinnvoll, über die Liste ein Glasspane zu legen? Dann lässt du sie enabled (allerdings nicht fokussierbar) und legst ein transparantes Panel über die Liste, welches Eingaben abfängt.
Für Frames gibt's die Funktion von Haus aus, bei einer JList müsste man da halt etwas tricksen, dem Scrollpane ein Panel übergeben, das sowohl List als auch das Glasspane enthält.
Vorteil: Auch der Rest der Liste (Scrollbar, Linien) werden als enabled dargestellt.
 
Der Ansatz mit dem Glasspane ist sehr interessant.
Ich habe in der Zwischenzeit allerdings erstmal folgendes probiert:

Java:
      jList.setSelectionForeground(Color.BLACK);
      jList.setFocusable(false);

Das scheint gut zu funktionieren.
 

Zurück
Oben