Oracle
 sql >> база данни >  >> RDS >> Oracle

Как Java за OS X 2013-004 засяга (прекъсва) Swing приложения?

Актуализация 2013-06-21:този отговор съдържа някои заобикалящи решения и алтернативи, които може да са полезни, но отговорът на @sidney-markowitz-biomatters съдържа правилната корекция на кода - LAF трябва да бъде зададен от нишката за събитие!

Последните проблеми изглежда са свързани с актуализациите, нарушаващи Aqua Look and Feel (LAF), което е по подразбиране за приложенията Swing в Mac OS X.

Ако имате нужда от Aqua LAF, тогава няма много опции. Може да се наложи да изчакате следващата актуализация на Java от Apple (предполагам, че ще коригират това с приоритет, като се има предвид, че това е техният собствен LAF). Можете също да опитате да използвате Java Application Bundler (т.е. да свържете Oracle JRE и да избегнете използването на JRE на системата).

Ако можете да се справите с различен LAF, приложението ви трябва да работи нормално. Поне за PaperCut беше така (актуализацията 003 причини някои проблеми с фокуса на прозореца, актуализацията 004 предизвика хаос).

Някои опции:

  • Използване на специфичната за версията на Java кросплатформена LAF от Java код (напр. Nimbus или Metal):

    UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName())
    
  • Задаване на конкретен LAF от Java код:

    UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel")
    
  • Отмяна на LAF по подразбиране от терминал:

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

В нашия случай изрично извикахме UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()) в нашия код и искахме заобиколно решение, което не включва промяна на кода (т.е. актуална корекция), така че трябваше да заменим системата по подразбиране LAF, както следва.

  • Отмяна на системния LAF от терминал:

    java -Dswing.systemlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel ...
    
  • Отменяне на системния LAF от Info.plist файла (ако имате пакетно приложение като Mac приложение, работи и за другите опции за VM) (напр. в My.app/Contents/Info.plist ).

    Искате да добавите -Dswing.systemlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel до края на стойност за VMOptions <ключ> . Опциите са разделени с пространство, точно както от терминала. напр. ако вече имате useScreenMenuBar опция:

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


Редактиране:@trashgod поиска възпроизводим пример. Не съм сигурен какъв е пълният обхват на проблемите с актуализацията 004, но ето едно просто възпроизвеждане:

Актуализация 2013-06-21 - грешен начин, възпроизвеждане на грешката:

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. Стартирайте с Apple JRE, който идва с актуализацията 004 (напр. в /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home ). Обърнете внимание, че съобщението не се вижда, иконата на диалоговия прозорец не се вижда и бутонът не може да се щракне видимо.

  2. Работете с по-стар Apple JRE или друг JRE. Обърнете внимание, че диалоговият прозорец се показва според очакванията.

Актуализация 2013-06-21 – правилният начин, в нишката за събитие, работи правилно:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да използвам CREATE OR REPLACE?

  2. LOG() Функция в Oracle

  3. Грешка при инсталиране на клиента на Oracle – пътят е твърде дълъг

  4. Използване на Dapper със съхранени процедури на Oracle, които връщат курсори

  5. Грешка при използване на oracle.dataaccess.dll