sql >> Databáze >  >> RDS >> Oracle

Jak Java pro OS X 2013-004 ovlivňuje (přerušuje) aplikace Swing?

Aktualizace 2013-06-21:tato odpověď obsahuje některá zástupná řešení a alternativy, které mohou být užitečné, ale odpověď @sidney-markowitz-biomatters obsahuje správnou opravu kódu – LAF je třeba nastavit z vlákna události! em>

Zdá se, že nedávné problémy souvisejí s aktualizacemi, které porušují Aqua Look and Feel (LAF), což je výchozí nastavení pro aplikace Swing v systému Mac OS X.

Pokud potřebujete Aqua LAF, pak není příliš mnoho možností. Možná budete muset počkat na další aktualizaci Java od společnosti Apple (předpokládám, že to opraví přednostně, protože je to jejich vlastní LAF). Můžete také zkusit použít Java Application Bundler (tj. sbalit Oracle JRE a vyhnout se použití systémového JRE).

Pokud si vystačíte s jiným LAF, pak by vaše aplikace měla fungovat jako obvykle. Přinejmenším tomu tak bylo pro PaperCut (aktualizace 003 způsobila určité problémy se zaostřením okna, aktualizace 004 způsobila chaos).

Některé možnosti:

  • Použití multiplatformního LAF z kódu Java (např. Nimbus nebo Metal):

    UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName())
    
  • Nastavení konkrétního LAF z kódu Java:

    UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel")
    
  • Přepsání výchozího LAF z terminálu:

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

V našem případě jsme explicitně volali UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()) v našem kódu a chtěli jsme řešení, které nezahrnuje změnu kódu (tj. opravu hotfix), takže jsme museli přepsat výchozí systém LAF následovně.

  • Přepsání systému LAF z terminálu:

    java -Dswing.systemlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel ...
    
  • Přepsání systémového LAF z Info.plist soubor (pokud máte v balíčku jako aplikaci pro Mac, funguje také pro další možnosti virtuálního počítače) (např. na My.app/Contents/Info.plist ).

    Chcete přidat -Dswing.systemlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel do konce z <string> hodnotu pro VMOptions <key> . Možnosti jsou prostorově oddělené, stejně jako u terminálu. Např. pokud již máte useScreenMenuBar možnost:

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


Edit:@trashgod požádal o reprodukovatelný příklad. Nejsem si jistý, jaký je úplný rozsah problémů s aktualizací 004, ale zde je jednoduchá reprodukce:

Aktualizace 21. 6. 2013 – nesprávný způsob, reprodukující chybu:

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. Spusťte s Apple JRE, které je součástí aktualizace 004 (např. na /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home ). Všimněte si, že zpráva není viditelná, ikona dialogu není viditelná a tlačítko není viditelně klikatelné.

  2. Spusťte se starším Apple JRE nebo jiným JRE. Všimněte si, že se dialogové okno zobrazí podle očekávání.

Aktualizace 21. 6. 2013 – správný způsob ve vláknu události funguje správně:

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


  1. Jak implementovat vztah many-to-many v PostgreSQL?

  2. Nativní dotaz hibernace – sloupec char(3).

  3. SQL Server 2016

  4. Jak pracovat s databázemi PostgreSQL