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

标签 java multithreading netbeans midi anonymous-class

我开发了一个简单的 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,如果有帮助的话 - javax.sound.midi)

感谢您的宝贵时间。

编辑:

在用户界面上再点击一下,发现一些有趣的东西;除了左上角的两个组合框之外,一切似乎都工作正常,我尝试删除它们并替换它们,但没有什么区别。单击时,这些框会变为蓝色(通常会如此),但下拉框不会出现在其下方,并且当焦点位于另一个 UI 组件上时,颜色不会返回到默认值。这可能是 NetBeans 引入的错误吗?

示例:

enter image description here

编辑2:

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

感谢大家的反馈!

最佳答案

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

尝试在播放线程(即不是 UI 线程)上创建音序器,看看是否可以释放您的 UI。

关于java - 在单独的线程中运行逻辑仍然锁定 UI - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5690055/

相关文章:

java - 如何将变量数组传递给android中的REST URL?

嵌套的Java正则表达式

java - 线程内的 Looper.prepare() 错误

java - Derby 嵌入式数据库创建表结构

java - 无法使用 netbeans GUI 生成器调用 UI 类

java - 无法让我的程序正确读入文件以执行方法

java - 如何接收非英文字符作为 spring bean

java - 工作线程上的 CyclicBarrier

java - 并行并顺序地处理Java任务

c++ - NetBeans 6.7.1、Linux、C++ 中的 "Unable to resolve..."