Aktualizacja 21.06.2013:ta odpowiedź zawiera kilka obejść i alternatyw, które mogą być przydatne, ale odpowiedź @sidney-markowitz-biomatters zawiera poprawną poprawkę kodu — LAF należy ustawić z wątku zdarzenia!
Ostatnie problemy wydają się być związane z aktualizacjami, które łamią Aqua Look and Feel (LAF), który jest domyślny dla aplikacji Swing w systemie Mac OS X.
Jeśli potrzebujesz Aqua LAF, nie ma zbyt wielu opcji. Być może będziesz musiał poczekać na następną aktualizację Javy od Apple (zakładam, że naprawią to priorytetowo, biorąc pod uwagę, że jest to ich własny LAF). Możesz także spróbować użyć pakietu Java Application Bundler (tj. spakować Oracle JRE i uniknąć korzystania z JRE systemu).
Jeśli możesz sobie poradzić z innym LAF, Twoja aplikacja powinna działać normalnie. Tak było przynajmniej w przypadku PaperCut (aktualizacja 003 spowodowała pewne problemy z fokusem w oknie, aktualizacja 004 spowodowała chaos).
Niektóre opcje:
-
Korzystanie z wieloplatformowego LAF specyficznego dla wersji Java z kodu Java (np. Nimbus lub Metal):
UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName())
-
Ustawianie określonego LAF z kodu Java:
UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel")
-
Zastępowanie domyślnego LAF z terminala:
java -Dswing.defaultlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel MyApp
W naszym przypadku jawnie wywołaliśmy UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName())
w naszym kodzie i chcieliśmy obejść, które nie wymagałoby zmiany kodu (tj. poprawki), więc musieliśmy zastąpić domyślny system LAF w następujący sposób.
-
Zastępowanie systemu LAF z terminala:
java -Dswing.systemlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel ...
-
Zastępowanie systemowego LAF z
Info.plist
plik (jeśli masz dołączoną aplikację na Maca, działa również z innymi opcjami maszyny wirtualnej) (np. wMy.app/Contents/Info.plist
).Chcesz dodać
-Dswing.systemlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel
do końca
wartość dlaVMOptions
. Opcje są oddzielone spacjami, tak jak w terminalu. Np. jeśli masz już useScreenMenuBar
opcja:<key>VMOptions</key> <string>-Dcom.apple.macos.useScreenMenuBar=true -Dswing.systemlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel</string>
Edytuj:@trashgod poprosił o powtarzalny przykład. Nie jestem pewien, jaki jest pełny zakres problemów z aktualizacją 004, ale oto prosta reprodukcja:
Aktualizacja 21.06.2013 – zły sposób, odtworzenie błędu:
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");
}
}
-
Uruchom z Apple JRE dostarczanym z aktualizacją 004 (np. w
/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
). Zauważ, że wiadomość nie jest widoczna, ikona okna dialogowego nie jest widoczna, a przycisk nie jest widoczny. -
Uruchom ze starszym Apple JRE lub innym JRE. Zauważ, że okno dialogowe wyświetla się zgodnie z oczekiwaniami.
Aktualizacja 21.06.2013 – we właściwy sposób, w wątku wydarzeń, działa poprawnie:
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();
}
}
});
}
}