在单独的线程中运行逻辑仍然会锁定UI-Java

在单独的线程中运行逻辑仍然会锁定UI-Java,java,multithreading,netbeans,midi,anonymous-class,Java,Multithreading,Netbeans,Midi,Anonymous Class,我开发了一个简单的MIDI应用程序,允许我播放MIDI音符,为了让用户能够在播放MIDI声音时与UI交互,我在一个匿名子类中加入了必要的逻辑,如下所示: public static void Play() { new Thread(new Runnable() { public void run() { if (!_sequencer.isRunning())

我开发了一个简单的MIDI应用程序,允许我播放MIDI音符,为了让用户能够在播放MIDI声音时与UI交互,我在一个匿名子类中加入了必要的逻辑,如下所示:

public static void Play() 
{
        new Thread(new Runnable() 
        {
            public void run() 
            {
                if (!_sequencer.isRunning()) 
                {
                    try 
                    {
                        _sequencer.setSequence(_sequence);
                        _sequencer.start();
                    } 
                    catch (Exception e) 
                    {
                        Logger.Add(e.getMessage());
                    }
                }
            }
        }).start();
    }
虽然音乐开始播放,但当我点击一个组合框时,UI仍然无法响应,例如,我在C#中也有类似的功能

Java中的线程是否有某种警告可以解释我看到的行为

(如果有帮助,我正在使用的Java API-)

谢谢你抽出时间

编辑:

再点击一下UI,就会发现一些有趣的东西;除了左上角的两个组合框外,一切似乎都很正常,我尝试过删除它们并替换它们,但没有任何区别。单击时,框变为蓝色(正常情况下是这样),但下拉框不会显示在其下方,并且当焦点位于另一个UI组件上时,颜色不会返回到默认值。这可能是NetBeans引入的bug吗

示例:

编辑2:


经过多次尝试和错误,我终于找到了问题的原因,线程工作得很好。问题是,NetBeans以某种方式重新调整了我的UI组件,导致窗口填满屏幕,手动调整组合框的大小并对其进行测试,结果表明它们实际上工作得很好


谢谢大家的反馈

当点击组合框时,它会做什么?它是否与
\u定序器
交互?此外,您的sequencer是在UI线程上创建的吗?我怀疑,当您在单独的线程上调用start方法时,sequencer仍然在创建它的上下文(即UI线程)上运行


尝试在播放线程(即不是UI线程)上创建sequencer,看看这是否释放了UI。

经过多次尝试和错误,我终于找到了问题的原因,线程工作得很好。问题在于,NetBeans以某种方式重新调整了我的UI组件,这导致窗口填满屏幕,手动调整组合框的大小并对其进行测试,结果表明它们实际上工作正常。

我怀疑您的组合框初始化代码,而不是MIDI代码。为了向自己证明这一点,不要启动midi线程,看看组合框是否仍然乱七八糟。你在linux上吗?这里有一个猜测:尝试在启动应用程序的命令行中添加-Dsun.awt.disablegrab=true。我已经用解决方案更新了我的问题:)@Jamie,great:)。。。至少你明白了!