2011-04-16 29 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

相關問題