JComboBox.setEnabled(false) Darstellung ändern

JavaRentner

Aktives Mitglied
Hallo Wissende,
wenn ich eine JComboBox mit setEnabled(false) setze, wird alles grau in grau angezeigt! (kaum lesbar)

Ist es möglich eine disabled JComboBox farblich so zu gestalten, dass es lesbar wird?
  • Hintergrund WEISS nicht grau.
  • ForeGround ROT nicht grau.
Entweder habe ich im Google die falschen Fragen gestellt, oder es gibt keine Möglichkeit...

Weiss Jemand wie ich das umsetzen könnte?
Habe iwas mit ColorRenderer gefunden... (Bahnhof wie umsetzen)

Geht das irgendwie mit ".setDisabledTextColor(Color.RED);" und ".setDisabledBackgrund(Color.WHITE);" ?

Vielen Dank
 
Das haengt vom verwendeten Look and Feel ab. Das GTK+-LaF zum Beispiel unterstuetzt nichts derartiges. Metal erlaubt es, glaube ich, und so weiter.

Also das haengt komplett vom LaF/Theme ob du das aendern kannst und wenn ja, wie. Meistens unterstuetzen LaFs das setzen von solchen Parametern, das FlatLaF zum Beispiel wuerde dies erlauben.
 
Das ist in Swing leider nicht so einfach, weil deaktivierte Komponenten vom LAF gesteuert werden.

Aber es gibt einen einfachen Workaround, indem du sie nicht deaktivierst, sondern nicht anklickbar machst.

Java:
Color bgDisabled = Color.WHITE;
Color fgDisabled = Color.RED;
comboBox.setBackground(bgDisabled);
comboBox.setForeground(fgDisabled);
comboBox.setFocusable(false);
comboBox.setEditable(false);
 
Das ist in Swing leider nicht so einfach, weil deaktivierte Komponenten vom LAF gesteuert werden.

Aber es gibt einen einfachen Workaround, indem du sie nicht deaktivierst, sondern nicht anklickbar machst.

Java:
Color bgDisabled = Color.WHITE;
Color fgDisabled = Color.RED;
comboBox.setBackground(bgDisabled);
comboBox.setForeground(fgDisabled);
comboBox.setFocusable(false);
comboBox.setEditable(false);
Guter Ansatz, aber wenn ich mit der Maus draufklicke öffnet sich das Popumenü trotzdem.
Kann man da iwie den MouseHandler abfangen und das Popumenü sofort wieder schliessen oder garnicht erst öffnen lassen?
 
Das ist auch LaF Abhaengig ob das geht oder nicht.
Solange die ComboBox enabled ist hab ich das hingekriegt und funktioniert.

Wäre es möglich einen eigenen LaF zu schreiben der nur für meine SuperCombo-Klasse gültig ist oder ist das dann Systemweit?

Ich habe eine Anwendung die mehrere JInternalFrames enthält, aber nur auf einem müsste meine SuperCombo-Klasse eingesetzt werden können.
Vielen Dank.
 
Ist es möglich eine disabled JComboBox farblich so zu gestalten, dass es lesbar wird?
  • Hintergrund WEISS nicht grau.
  • ForeGround ROT nicht grau.
Vielleicht ist die Antwort simpel ein anderes LaF zu verwenden?
Und dann gibt es ja noch die mitgelieferten. Ich bilde mir ein es haette noch ein gutes gegeben welches aehnlich wie FlatLaF ist, aber das finde ich gerade nicht.

Wäre es möglich einen eigenen LaF zu schreiben der nur für meine SuperCombo-Klasse gültig ist oder ist das dann Systemweit?
Soweit ich weisz muesste das gehen, du kannst dich auch vom aktuell verwendeten LaF ableiten, aber das ist je nachdem relativ kompliziert. Die Swing Komponenten bestehen quasi aus Model/Controller und View. Das LaF bestimmt das gesamte Aussehen, also kannst du von javax.swing.plaf.ComboBoxUI ableiten und dieses dann per setUI auf die JComboBox deiner Wahl setzen. Eventuell wird das halt etwas Forschungsarbeit wie das LaF funktioniert und was man daran wirklich aendern kann.
 
Vielleicht ist die Antwort simpel ein anderes LaF zu verwenden?
Und dann gibt es ja noch die mitgelieferten. Ich bilde mir ein es haette noch ein gutes gegeben welches aehnlich wie FlatLaF ist, aber das finde ich gerade nicht.


Soweit ich weisz muesste das gehen, du kannst dich auch vom aktuell verwendeten LaF ableiten, aber das ist je nachdem relativ kompliziert. Die Swing Komponenten bestehen quasi aus Model/Controller und View. Das LaF bestimmt das gesamte Aussehen, also kannst du von javax.swing.plaf.ComboBoxUI ableiten und dieses dann per setUI auf die JComboBox deiner Wahl setzen. Eventuell wird das halt etwas Forschungsarbeit wie das LaF funktioniert und was man daran wirklich aendern kann.
Sorry, wo und wie setze ich ein LaF? Und welche auswirkungen hat das auf andere Komponenten?
Bin wirklich Anfänger und blicke grad nicht durch.

Möchte das LaF nur in der SuperCombo-Klasse verwenden.
 
Fuer die gesamte Applikation, das Oracle Tutorial dazu beinhaltet alles dazu. Also in Kurzfassung:
  1. Jar hinzufuegen (falls notwendig).
  2. Als erstes in der main machen.
Falls du einzelne Klassen aendern willst, auf den JComponent gibt es die Methode setUI welche die UI ("View") Klasse uebernimmt. Da kannst du auch deine eigene d'ruber setzen fuer einzelne Komponenten. Oder du registrierst deine als Standard, da weisz ich aber gerade nicht wie das genau geht, irgendwas mit der UIDefaults Klasse wahrscheinlich.
 
Brave sagt:

Hi Brave, how can I style a Java Swing GUI?


You can style a Java Swing GUI using several approaches, ranging from built-in look and feel options to advanced customizations. The most straightforward method involves setting a different look and feel (L&F) to change the overall appearance of the application. Java provides several built-in look and feels, including Metal (the default cross-platform look), System (which mimics the native OS), Windows, and GTK. You can set the look and feel programmatically using UIManager.setLookAndFeel() with the appropriate class name, such as UIManager.getCrossPlatformLookAndFeelClassName() for Metal or UIManager.getSystemLookAndFeelClassName() for the system's native look.

For a more modern and visually appealing appearance, you can use third-party look and feel libraries. Popular options include FlatLaf, which offers a clean, flat design, and commercial libraries like Synthetica or JTattoo, which provide highly customizable themes. These libraries often require adding their JAR files to your project's build path and setting the look and feel via UIManager.setLookAndFeel() with the specific class from the library.

For even greater control over styling, you can use CSS-like styling with libraries such as Java-CSS. This allows you to define styles for Swing components using selectors and properties similar to web CSS, enabling you to style elements based on their type, name, state (like hover), or even complex relationships within the component hierarchy. This approach can be combined with layout managers like MigLayout for sophisticated layouts.

For the most customized appearance, you can create a completely custom window by setting setUndecorated(true) on your JFrame, which removes the default window decorations. You would then manually create a custom title bar and implement your own functionality for moving, resizing, minimizing, and closing the window by handling mouse events on custom components. This method provides full control but requires significant custom code to replicate standard window behaviors.
 
Ist es möglich eine disabled JComboBox farblich so zu gestalten, dass es lesbar wird?
Eine Quick & Dirty Lösung könnte sein (aber wie oben schon geschrieben: abhängig vom LaF), die ComboBox editierbar zu machen:
Java:
JComboBox box = new JComboBox();
box.setEnabled(false);
box.setEditable(true);
JOptionPane.showMessageDialog(null, box);

1760186797039.png
 
Eine Quick & Dirty Lösung könnte sein (aber wie oben schon geschrieben: abhängig vom LaF), die ComboBox editierbar zu machen:
Java:
JComboBox box = new JComboBox();
box.setEnabled(false);
box.setEditable(true);
JOptionPane.showMessageDialog(null, box);

Anhang anzeigen 23625
Vielen Dank das wäre in etwa das was ich suchte.

Das Problem ist nur noch die Textfarbe im obigen Zustand der ComboBox.
Ich wollte dass der Text ROT geschrieben wird, aber ich komme nicht an das Feld das mir den augewählten Text anzeigt.
Java:
setForeground(Color.RED);
ändert nur die Textfarbe im DropDown-Menü nicht im obigen Feld.

Wie komme ich an dieses Feld um es umzugestalten?
Ist das ein JLabel, ein JTextField oder muss ich da über ein getDocument arbeiten?

Ich komme nicht an dieses Objekt!
  • getJLabel
  • getJTextfield
  • getDocument
hat nicht geholfen.

Hast Du dazu auch eine Lösung?
Mein Dank sei Dir sicher!
 
Zuletzt bearbeitet:
Also, ich habe mir das Metal-LaF mal angeschaut (ich nehme jetzt einfach mal dass ist was du verwendest):

Java:
javax.swing.plaf.basic.BasicComboBoxUI.paintCurrentValue(Graphics, Rectangle, boolean)

// SNIP

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

Die Farbe welche fuer die abgeschaltete Komponente kommt aus dem Eigenschaften "ComboBox.disabledForeground" und "ComboBox.disabledBackground". Tatsaechlich kann man diese zum Beispiel ueber den UIManager setzen:

Java:
// Main
UIManager.put("ComboBox.disabledForeground", Color.RED);
 
Vielen Dank @Robert Zenz
Java:
// Main
UIManager.put("ComboBox.disabledForeground", Color.RED);
UIManager.put("ComboBox.disabledBackground", Color.WHITE);
Genau DAS!!! war die Lösung!
Vielen herzlichen Dank!


Wie diesen Thread als gelösst markieren?
 

Zurück
Oben