Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie wirkt sich Java für OS X 2013-004 auf Swing-Anwendungen aus?

Update 2013-06-21:Diese Antwort enthält einige Problemumgehungen und Alternativen, die nützlich sein können, aber die Antwort von @sidney-markowitz-biomatters enthält den richtigen Code-Fix - der LAF muss aus dem Event-Thread festgelegt werden! em>

Die jüngsten Probleme scheinen mit den Updates zusammenzuhängen, die das Aqua Look and Feel (LAF) beschädigen, das die Standardeinstellung für Swing-Apps unter Mac OS X ist.

Wenn Sie den Aqua LAF benötigen, gibt es nicht allzu viele Optionen. Möglicherweise müssen Sie auf das nächste Java-Update von Apple warten (ich gehe davon aus, dass sie dies vorrangig beheben, da es sich um ein eigenes LAF handelt). Sie können auch versuchen, den Java Application Bundler zu verwenden (d. h. die Oracle JRE bündeln und die Verwendung der JRE des Systems vermeiden).

Wenn Sie mit einem anderen LAF auskommen, sollte Ihre App wie gewohnt funktionieren. Zumindest für PaperCut (das 003-Update verursachte einige Fensterfokusprobleme, das 004-Update verursachte Chaos).

Einige Optionen:

  • Verwenden des Java-versionsspezifischen plattformübergreifenden LAF aus Java-Code (z. B. Nimbus oder Metal):

    UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName())
    
  • Festlegen eines bestimmten LAF aus Java-Code:

    UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel")
    
  • Überschreiben des Standard-LAF vom Terminal:

    java -Dswing.defaultlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel MyApp
    

In unserem Fall haben wir explizit UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()) aufgerufen in unserem Code und wollten eine Problemumgehung, die keine Codeänderung beinhaltete (d. h. einen Hotfix), also mussten wir das standardmäßige System überschreiben LAF wie folgt.

  • Überschreiben des System-LAF vom Terminal:

    java -Dswing.systemlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel ...
    
  • Überschreiben des System-LAF von einer Info.plist Datei (wenn Sie es als Mac-Anwendung gebündelt haben, funktioniert es auch für die anderen VM-Optionen) (z. B. unter My.app/Contents/Info.plist). ).

    Sie möchten -Dswing.systemlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel hinzufügen bis zum Ende des <string> Wert für die VMOptions <key> . Die Optionen sind wie beim Terminal durch Leerzeichen getrennt. Z.B. wenn Sie bereits eine useScreenMenuBar haben Möglichkeit:

    <key>VMOptions</key>
    <string>-Dcom.apple.macos.useScreenMenuBar=true -Dswing.systemlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel</string>
    


Edit:@trashgod bat um ein reproduzierbares Beispiel. Ich bin mir nicht sicher, was der volle Umfang der Probleme mit dem 004-Update ist, aber hier ist eine einfache Reproduktion:

Update 2013-06-21 - der falsche Weg, Reproduktion des Fehlers:

public class AquaLafTest {
    public static void main(String[] args) throws Exception {
        javax.swing.UIManager.setLookAndFeel(javax.swing.UIManager.getSystemLookAndFeelClassName());
        javax.swing.JOptionPane.showMessageDialog(null, "msg");
    }
}
  1. Führen Sie es mit der Apple JRE aus, die mit dem 004-Update geliefert wird (z. B. unter /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home). ). Beachten Sie, dass die Nachricht nicht sichtbar ist, das Dialogsymbol nicht sichtbar ist und die Schaltfläche nicht sichtbar anklickbar ist.

  2. Mit einer älteren Apple JRE oder einer anderen JRE ausführen. Beachten Sie, dass das Dialogfeld wie erwartet angezeigt wird.

Update 2013-06-21 - der richtige Weg, im Event-Thread, funktioniert richtig:

public class AquaLafTest {
    public static void main(String[] args) throws Exception {
        javax.swing.SwingUtilities.invokeAndWait(new Runnable() {
            public void run() {
                try {
                    javax.swing.UIManager.setLookAndFeel(javax.swing.UIManager.getSystemLookAndFeelClassName());
                    javax.swing.JOptionPane.showMessageDialog(null, "msg");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
}