Cập nhật 2013-06-21:câu trả lời này chứa một số cách giải quyết và lựa chọn thay thế có thể hữu ích, nhưng câu trả lời của @ sidney-markowitz-biomatters chứa bản sửa lỗi mã chính xác - LAF cần được đặt từ chuỗi sự kiện!
Các sự cố gần đây dường như liên quan đến các bản cập nhật phá vỡ Aqua Look and Feel (LAF), vốn là mặc định cho các ứng dụng Swing trên Mac OS X.
Nếu bạn cần Aqua LAF thì không có quá nhiều lựa chọn. Bạn có thể cần đợi bản cập nhật Java tiếp theo từ Apple (tôi cho rằng họ sẽ ưu tiên sửa lỗi này, vì đó là LAF của riêng họ). Bạn cũng có thể thử sử dụng Java Application Bundler (tức là gói Oracle JRE và tránh sử dụng JRE của hệ thống).
Nếu bạn có thể sử dụng LAF khác thì ứng dụng của bạn sẽ hoạt động bình thường. Nó đã làm được cho PaperCut, ít nhất (bản cập nhật 003 gây ra một số vấn đề về tiêu điểm cửa sổ, bản cập nhật 004 gây ra tình trạng lộn xộn).
Một số tùy chọn:
-
Sử dụng LAF nền tảng chéo dành riêng cho phiên bản Java từ mã Java (ví dụ:Nimbus hoặc Metal):
UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName())
-
Đặt LAF cụ thể từ mã Java:
UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel")
-
Ghi đè LAF mặc định từ thiết bị đầu cuối:
java -Dswing.defaultlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel MyApp
Trong trường hợp của chúng tôi, chúng tôi đang gọi UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName())
một cách rõ ràng trong mã của chúng tôi và muốn một giải pháp thay thế không liên quan đến thay đổi mã (tức là một hotfix), vì vậy chúng tôi cần ghi đè hệ thống mặc định LAF như sau.
-
Ghi đè LAF của hệ thống từ thiết bị đầu cuối:
java -Dswing.systemlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel ...
-
Ghi đè LAF hệ thống từ
Info.plist
tập tin (nếu bạn đã đóng gói dưới dạng ứng dụng Mac, cũng hoạt động cho các tùy chọn VM khác) (ví dụ:tạiMy.app/Contents/Info.plist
).Bạn muốn thêm
-Dswing.systemlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel
đến cuối cùng của<string>
giá trị choVMOptions
<key>
. Các tùy chọn được phân tách bằng không gian, giống như từ thiết bị đầu cuối. Ví dụ. nếu bạn đã cóuseScreenMenuBar
tùy chọn:<key>VMOptions</key> <string>-Dcom.apple.macos.useScreenMenuBar=true -Dswing.systemlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel</string>
Chỉnh sửa:@trashgod đã yêu cầu một ví dụ có thể tái tạo. Tôi không chắc phạm vi đầy đủ của các vấn đề với bản cập nhật 004 là gì, nhưng đây là một bản tái tạo đơn giản:
Cập nhật 2013-06-21 - sai cách, tạo ra lỗi:
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");
}
}
-
Chạy với Apple JRE đi kèm với bản cập nhật 004 (ví dụ:tại
/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
). Quan sát rằng thông báo không hiển thị, biểu tượng hộp thoại không hiển thị và không thể nhấp vào nút. -
Chạy với Apple JRE cũ hơn hoặc JRE khác. Quan sát hộp thoại hiển thị như mong đợi.
Cập nhật 2013-06-21 - đúng cách, trên chuỗi sự kiện, hoạt động chính xác:
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();
}
}
});
}
}