java - Java for OS X 2013-004 如何影响(破坏)Swing 应用程序?

标签 java macos oracle swing

似乎 Java for OS X 2013-004 (Java 1.6.0_51) 破坏了一些 Swing 应用程序:https://discussions.apple.com/message/22279872?tstart=0#22279872?tstart=0 http://www.mathworks.com/matlabcentral/answers/79489

我的应用加载了,但没有正常重绘。单击按钮和其他操作实际上似乎有效,但只有在调整框架大小时显示才会更新 - 真的很奇怪。

有人知道问题出在哪里吗?

编辑: Apple 似乎修复了它:http://lists.apple.com/archives/java-dev/2013/Jun/msg00055.html

最佳答案

2013 年 6 月 21 日更新:此答案包含一些可能有用的解决方法和替代方案,但 @sidney-markowitz-biomatters' answer包含正确的代码修复 - LAF 需要从事件线程设置!

最近的问题似乎与打破 Aqua Look and Feel (LAF) 的更新有关,这是 Mac OS X 上 Swing 应用程序的默认设置。

如果您需要 Aqua LAF,那么没有太多选择。您可能需要等待 Apple 的下一次 Java 更新(我假设他们会优先解决此问题,因为这是他们自己的 LAF)。您也可以尝试使用 Java Application Bundler (即捆绑 Oracle JRE 并避免使用系统的 JRE)。

如果您可以使用不同的 LAF,那么您的应用应该可以正常运行。它为 PaperCut 做了,至少(003 更新导致了一些窗口焦点问题,004 更新导致了困惑)。

一些选项:

  • 使用 Java version-specific来自 Java 代码(例如 Nimbus 或 Metal)的跨平台 LAF:

    UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName())
    
  • 从 Java 代码设置特定的 LAF:

    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 ...
    
  • Info.plist 覆盖系统 LAF文件(如果您已捆绑为 Mac 应用程序,也适用于其他 VM 选项)(例如 My.app/Contents/Info.plist)。

    您想添加-Dswing.systemlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel<string>结尾 VMOptions 的值<key> .选项以空格分隔,就像终端一样。例如。如果你已经有了 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. 使用 004 更新附带的 Apple JRE 运行(例如 /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home)。观察消息不可见,对话框图标不可见,按钮不可点击。

  2. 使用较旧的 Apple JRE 或其他 JRE 运行。观察对话框是否按预期显示。

2013 年 6 月 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();
                }
            }
        });
    }
}

关于java - Java for OS X 2013-004 如何影响(破坏)Swing 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17204465/

相关文章:

java - 动态添加的 JPanel 未显示在 Swing 中

Mac 10.6.8 上的 Xcode 4.3.1

objective-c - addObserverForName 并删除观察者

sql - 调用 Oracle 存储过程时使用 ADODB 的旧 VB6 应用程序抛出错误

python - Pyodbc 连接到 Oracle

java - 测试用 Java 写入文件的方法

java - Windows 中 Java 应用程序和 C++ 应用程序之间的同步

java - Gson:如果元素类型是动态的,JSON 到 java 对象转换问题

AppleScript 语法

sql - 如何在函数中抛出异常