2011-04-16 49 views
1

我开发了一个简单的MIDI应用程序,它允许我播放MIDI音符,以便用户在MIDI声音播放时能够与UI交互。像这样必要的匿名子类中的逻辑:在单独的线程中运行逻辑仍然锁定用户界面 - Java

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仍然失败,当我点击,例如一个ComboBox回应,我也有类似的工作在C#细的东西。

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

(我使用它是否有助于Java的API - javax.sound.midi

感谢您的时间。

编辑:

点击周围的UI多一点,并发现了一些有趣的;一切似乎都工作正常,除了最左上角的两个ComboBoxes,我试过删除它们并替换它们,但没有任何区别。点击时框会变成蓝色(正常情况下),但下拉框不会出现在其下方,并且当焦点位于另一个UI组件上时,颜色不会返回到默认值。它可能是NetBeans引入的错误吗?

例子:

enter image description here

编辑2:

多的反复试验后嗯,我终于找到了问题的原因,穿线的伟大工程。问题在于,NetBeans以某种方式重新整理了我的UI组件,这些组件会导致Window填充屏幕,手动调整大小并测试ComboBoxes,结果表明它们实际上运行良好。

感谢每一个人的反馈!

+1

我会怀疑你的COmboBox初始化代码,比MIDI代码更多。为了向你自己证明,不要启动MIDI线程,看看组合框是否仍然混乱。 – MeBigFatGuy 2011-04-16 23:10:57

+0

你在linux上吗?这是一个疯狂的猜测:尝试在启动应用程序的命令行中添加-Dsun.awt.disablegrab = true。 – MeBigFatGuy 2011-04-16 23:13:08

+0

我已经用解决方案更新了我的问题:) – 2011-04-17 16:42:09

回答

0

经过大量的试验和错误,我终于找到了问题的原因,线程工作很好。问题在于,NetBeans以某种方式重新整理了我的UI组件,这些组件会导致Window填充屏幕,手动调整大小并测试ComboBoxes,结果表明它们实际上运行良好。

2

组合框单击时会发生什么?它是否与_sequencer交互?此外,你的音序器是在UI线程上创建的吗?我怀疑,当你在一个单独的线程上调用start方法时,sequencer仍然在它创建的上下文(即UI线程)上运行。

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

+0

我已经用解决方案更新了我的问题:) – 2011-04-17 16:41:35

+0

@Jamie,太棒了:)至少你已经明白了! – Kiril 2011-04-18 23:56:30

相关问题