Pembaruan 21-06-2013:jawaban ini berisi beberapa solusi dan alternatif yang mungkin berguna, tetapi jawaban @sidney-markowitz-biomatters berisi perbaikan kode yang benar - LAF perlu disetel dari utas acara!
Masalah baru-baru ini tampaknya terkait dengan pembaruan yang melanggar Aqua Look and Feel (LAF), yang merupakan default untuk aplikasi Swing di Mac OS X.
Jika Anda membutuhkan Aqua LAF maka tidak ada terlalu banyak pilihan. Anda mungkin perlu menunggu pembaruan Java berikutnya dari Apple (saya berasumsi mereka akan memperbaikinya dengan prioritas, mengingat itu adalah LAF mereka sendiri). Anda juga dapat mencoba menggunakan Java Application Bundler (yaitu membundel Oracle JRE dan menghindari menggunakan JRE sistem).
Jika Anda bisa bertahan dengan LAF yang berbeda maka aplikasi Anda akan berfungsi seperti biasa. Itu berlaku untuk PaperCut, setidaknya (pembaruan 003 menyebabkan beberapa masalah fokus jendela, pembaruan 004 menyebabkan kekacauan).
Beberapa opsi:
-
Menggunakan LAF lintas platform khusus versi Java dari kode Java (mis. Nimbus atau Metal):
UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName())
-
Menyetel LAF tertentu dari kode Java:
UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel")
-
Mengganti LAF default dari terminal:
java -Dswing.defaultlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel MyApp
Dalam kasus kami, kami secara eksplisit memanggil UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName())
dalam kode kami dan menginginkan solusi yang tidak melibatkan perubahan kode (yaitu perbaikan terbaru), jadi kami perlu mengganti sistem default LAF sebagai berikut.
-
Mengganti LAF sistem dari terminal:
java -Dswing.systemlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel ...
-
Mengganti LAF sistem dari
Info.plist
berkas (jika Anda telah dibundel sebagai aplikasi Mac, juga berfungsi untuk opsi VM lainnya) (mis. diMy.app/Contents/Info.plist
).Anda ingin menambahkan
-Dswing.systemlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel
sampai akhir dari<string>
nilai untukVMOptions
<key>
. Opsi dipisahkan oleh ruang, seperti dari terminal. Misalnya. jika Anda sudah memilikiuseScreenMenuBar
pilihan:<key>VMOptions</key> <string>-Dcom.apple.macos.useScreenMenuBar=true -Dswing.systemlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel</string>
Edit:@trashgod meminta contoh yang dapat direproduksi. Saya tidak yakin apa cakupan penuh dari masalah dengan pembaruan 004, tetapi berikut ini reproduksi sederhana:
Perbarui 21-06-2013 - cara yang salah, menghasilkan kesalahan:
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");
}
}
-
Jalankan dengan Apple JRE yang disertakan dengan pembaruan 004 (mis. di
/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
). Perhatikan bahwa pesan tidak terlihat, ikon dialog tidak terlihat, dan tombol tidak terlihat dapat diklik. -
Jalankan dengan Apple JRE lama atau JRE lain. Perhatikan bahwa dialog ditampilkan seperti yang diharapkan.
Perbarui 21-06-2013 - cara yang benar, di utas acara, berfungsi dengan benar:
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();
}
}
});
}
}