OS X上Java的GUI/线程不稳定;似乎与Swing/AWT相关->;可可桥

OS X上Java的GUI/线程不稳定;似乎与Swing/AWT相关->;可可桥,java,swing,macos,user-interface,crash,Java,Swing,Macos,User Interface,Crash,我遇到了一个非常令人沮丧的问题,涉及到OSX和JavaSwingGUI;具体来说,我在Cocoa兼容模式方面遇到了问题 我在一个机器人实验室工作,我们的很多软件都是通过内部模拟套件运行的。这个模拟套件的代码已经有近10年的历史了,是由我们的一位首席研究人员在大学期间创建的。模拟在Swing GUI中运行。这些模拟在Linux和Windows计算机上都运行良好,但在OSX上不运行 要明确的是,我写的代码不是GUI代码。我不是“鬼佬”。然而,他很久以前编写的代码提供了一个API,用于快速创建模拟,以

我遇到了一个非常令人沮丧的问题,涉及到OSX和JavaSwingGUI;具体来说,我在Cocoa兼容模式方面遇到了问题

我在一个机器人实验室工作,我们的很多软件都是通过内部模拟套件运行的。这个模拟套件的代码已经有近10年的历史了,是由我们的一位首席研究人员在大学期间创建的。模拟在Swing GUI中运行。这些模拟在Linux和Windows计算机上都运行良好,但在OSX上不运行

要明确的是,我写的代码不是GUI代码。我不是“鬼佬”。然而,他很久以前编写的代码提供了一个API,用于快速创建模拟,以基于关节和连杆的标准机械系统对机器人建模,这些模拟显示在GUI中,以便于启动、停止、记录、播放、跟踪变量、创建绘图、,所以我没有直接调用任何Swing代码;这些都是“沼泽标准”(针对我们的情况)的东西,我们的每一个模拟都会用到。而且每一个都在OS X上崩溃,而在Windows和Linux下运行得很好

我曾在互联网上四处搜索,虽然我还没有找到解决问题的方法,但问题的根源似乎是Cocoa Compatibility Mode希望程序员遵守图形界面的严格线程指南。最突出的一个例子是,如果不使用
SwingUtilities.invokeLater()
为GUI线程,那么代码将不稳定。编写代码的人承认,他在最初创建API时没有遵循最佳线程实践

Cocoa兼容模式似乎也会对某种Swing操作强制执行某种超时,不太清楚它是什么,但我使用的是2011年的MacBook Pro,它有2.3 GHz四核i7、8 gig RAM、SSD和1 gig Radeon 6750M。我想我不是在赶什么时间

我们在Eclipse中开发,并从Eclipse中启动我们的SIM(我们不需要将它们转换为任何形式的可执行文件)。启动模拟时,GUI将显示并完全填充。但是,它不能与任何对象交互。甚至“红绿灯”也不会激活,因此在Eclipse中使用terminate按钮是杀死GUI的唯一方法

。我不在Cocoa developer工作,因此错误本身对我来说并不太重要,但我知道NS前缀意味着错误来自Cocoa,我知道似乎发生的是某种线程管理器(可能是Grand Central Dispatch?)正在尝试对空锁对象执行操作,并且在某个时刻线程池出现问题

据我所知,目前没有办法禁用Cocoa兼容模式(以前似乎是通过使用Apple特定的java系统属性来禁用Cocoa兼容模式,但该属性不再出现在Apple Developer网站上提供的有效系统属性列表中)。我还尝试使用
-xstartonfirsthread
参数,但没有效果。虽然我们实验室主要是Linux和Windows驱动的,但我们的组织规模很大,一个不同的团队希望开始使用我们为他们的项目创建的一些模拟,这个部门主要是使用Mac的部门(我自己也是一个OS X用户,所以我想继续使用我的MBP)

有人能告诉我是否有办法禁用Cocoa兼容模式,或者至少我的怀疑是正确的吗?我们不是一个官僚机构,我们的老板知道代码有错误,所以如果我的直觉是正确的,那么执行直觉和重写并不是像在大公司那样不可能的。正如我已经说过的那样,模拟在其他操作系统上没有稳定性问题,而且许多由操作系统X的限制引起的稳定性问题似乎与提供令人愉快的用户体验有关,我们并不真正关心这一点,因为这不是面向用户的产品。它根本不是一种产品

我不是在寻找关于UX/UIX、非阻塞UI或线程/UI设计中的最佳实践的评论或答案。这些都是我熟悉的东西,这些都是我老板非常熟悉的东西。我只是希望有人能帮我消除OS X对Java代码的任意限制,或者能给我指出正确方向的人,这样我们就可以让当前代码符合OS的限制

我正在使用适用于OS X的最新JVM/JDK、最新OS X开发工具和最新版本的雪豹


编辑:这是一个自包含和编译的。它完全没有响应,就像上面所说的,虽然它没有所有的空锁错误,但它确实有自动释放错误,在OS X上不起作用。

除了缺少一个尾随大括号外,您的示例和下面的变体在使用Java 1.6.0_24的Mac OS 10.5.8上的操作与预期一样。特别是,鼠标、键盘和焦点都显示正常。请注意,将
add()
setLayout()
转发到内容窗格。我只是不习惯替换内容窗格

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.JTextField;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class FrameExample2 extends JFrame {

    private JPanel panel = new JPanel();
    private JTextField xAccelTextField = new JTextField(10);
    private JSlider xAccelSlider = new JSlider();

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                try {
                    FrameExample2 frame = new FrameExample2();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace(System.out);
                }
            }
        });
    }

    public FrameExample2() {
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        panel.setLayout(new GridLayout(0, 1));
        panel.setBorder(BorderFactory.createLineBorder(Color.gray, 8));
        panel.add(new JLabel("Linear Acceleration along X", JLabel.CENTER));
        panel.add(xAccelSlider);
        xAccelTextField.setEditable(false);
        xAccelTextField.setText("0");
        panel.add(xAccelTextField);
        xAccelTextField.setColumns(10);
        this.add(panel);
        this.pack();
        this.setLocationRelativeTo(null);
        xAccelSlider.addChangeListener(new ChangeListener() {

            @Override
            public void stateChanged(ChangeEvent e) {
                xAccelTextField.setText(
                    String.valueOf(xAccelSlider.getValue()));
            }
        });
    }
}

我遇到了同样的问题(在相同的macbook配置上),并找到了一个bug描述

首先,我在OSX上安装了openjdk 7:

我在eclipse中修改了项目构建路径,以指向新安装的jdk.1.7.0u (在我的Mac电脑上:
/Library/Java/JavaVirtualMachines/1.7.0u.jdk/Contents/Home/
),并且不再冻结用户界面。

您的应用程序是否使用Swing?重现问题的方法可能有助于澄清问题。@trashgood不,我们这样做了