Swing Java9 NullPointerException bei JComboBox

Roland13

Mitglied
Bis Java8 funktioniert die JComboBox ohne Exception.
Setze ich folgendes Look&Feel:
Code:
UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
dann erhalte ich ab Java9 folgende Exceptions:
Code:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at java.desktop/javax.swing.JComboBox.setPopupVisible(JComboBox.java:818)
    at java.desktop/javax.swing.JComboBox.hidePopup(JComboBox.java:809)
    at java.desktop/javax.swing.JComboBox$1.ancestorAdded(JComboBox.java:248)
...
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at java.desktop/javax.swing.JComboBox.setSelectedItem(JComboBox.java:573)
    at java.desktop/javax.swing.JComboBox.setSelectedIndex(JComboBox.java:624)
...

Was muss man für Java 9 und höher ändern um die Swing-Comboboxen mit dem default-Style weiterverwenden zu können?
 
das UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");, wenn es nicht das Metal LandF sein soll.
 
Kann es sein, dass es sich einfach nur um einen Bug handelt? Vielleicht ist das ganze ja in Java 10 gefixt.
Du könntest es auch einfach mal mit
Java:
UIManager.setLookAndFeel(new MetalLookAndFeel());
versuchen.

Soweit ich weiß wird das sowieso überall als die Cross-Platform Klasse genutzt.
 
Die ist nicht falsch, lies genau....

Und wo muss ich jetzt genauer lesen, damit Motif und nicht Metal das CrossPlatform L&F ist?

https://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html hat gesagt.:
CrossPlatformLookAndFeel—this is the "Java L&F" (also called "Metal") that looks the same on all platforms. It is part of the Java API (javax.swing.plaf.metal) and is the default that will be used if you do nothing in your code to set a different L&F.

https://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html hat gesagt.:
The GTK+, Motif, and Windows L&Fs are provided by Sun and shipped with the Java SDK and JRE, although they are not part of the Java API

https://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html hat gesagt.:
javax.swing.plaf.metal—the Java L&F, also known as the CrossPlatform L&F

javax/swing/UIManager.java hat gesagt.:
Java:
public static String getCrossPlatformLookAndFeelClassName() {
        String laf = AccessController.doPrivileged(
                             new GetPropertyAction("swing.crossplatformlaf"));
        if (laf != null) {
            return laf;
        }
        return "javax.swing.plaf.metal.MetalLookAndFeel";
    }
 
da auf Java10 bestimmte Look&Feel die auf Java 8 noch funktioniert haben eine Exception gebracht haben und ich es deshalb ausbauen musste hab ich bei meiner ComboBox eine Prüfung auf Java8 einbauen:
Code:
private javax.swing.plaf.ComboBoxUI CboDefault=Static.bDefaultLook && Static.Java8() ? new com.sun.java.swing.plaf.windows.WindowsComboBoxUI():null;
irgendwo später hab ich vergessen auf null zu prüfen, hab es nun geändert
Code:
if (CboDefault != null)
                      setUI(CboDefault);
nun funktioniert es wieder, komischerweise war in der Exception nichts davon zu sehen
 
@mrBrown die Methode heisst zwar cross platform LandF gibt aber mit Metal LandF NICHT das cross platform LandF zurück........ und ja - das steht irewo mittig auf der Seite

@Roland13 genial wäre es wenn du einfach das machen würdest und dann ✔ oder ⍻ .
Aber wenn es so auch dann ist die Frage beantwortet wohl........
 
@mrBrown die Methode heisst zwar cross platform LandF gibt aber mit Metal LandF NICHT das cross platform LandF zurück........ und ja - das steht irewo mittig auf der Seite
halten wir fest: überall steht Metal als CrossPlatform L&F, die entsprechende Methode gibt Metal zurück, Motif ist explizit nicht Teil der offiziellen API - aber du hast Recht und nicht Metal sondern Motif ist das CrossPlattform L&F, weil "das steht irewo mittig auf der Seite"?
 
Ich denke das Problem in Java9 und höher sind die Sun-Klassen:
Code:
if (Static.cLook=='W')
                       UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
                     else if (Static.cLook=='C')
                       UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel");
                     else if (Static.cLook=='G')
                       UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel");
                     else if (Static.cLook=='M')
                       UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");
                     else if (Static.cLook=='N')
                       UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
Wie schon geschrieben, ist mir durch das schnelle entfernen der Look&Feel der Fehler passiert, dass ich eine Bedingung übersehen/vergessen habe, um wenn es nicht gesetzt ist nicht zu setzen.
Nun mit der Bedingung gehen auch die Comboboxen, ich denke es ist damit erledigt, danke.
 

Zurück
Oben