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