2013-04-28 29 views
1

我在做,涉及到播放MIDI聲音,就在今天我遇到了在那裏打電話MidiSystem.getReceiver()凍結了的JFrame

MidiSystem.getReceiver() 

,或者打開一個MidiDevice問題的方案,完全阻止我做屏幕上顯示一幀。然後,如果我試圖在一切都凍結時終止一切,Eclipse會告訴我「終止失敗」。

下面是一些示例代碼,向您展示我的意思:

public static void main(String args[]) { 

    Receiver receiver; 

    try { 
     receiver = MidiSystem.getReceiver(); 
    } catch (MidiUnavailableException e) { 
     e.printStackTrace(); 
    } 

    JFrame frame = new JFrame("here's a frame"); 
    Dimension d = new Dimension(500,500); 
    frame.setSize(d); 
    frame.setPreferredSize(d); 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
} 

getReceiver()部分和JFrame部分各項工作對自己的罰款;只是當我有兩件東西停止工作。

任何幫助將不勝感激(順便說一句,我不是幾個星期前刊登了類似的代碼時......?有這個問題)。謝謝!

+0

我想氣墊船全鱔曾建議是當場上。也許當你在訂單不同之前做到這一點時 - >擺動渲染已經完成了? – tgkprog 2013-04-28 20:05:54

回答

1

Your Receiver正在加載Swing線程,以防止GUI運行。您必須在Swing事件線程或EDT的後臺線程中運行Receiver(E vent D ispatch T hread)。欲瞭解更多關於此,請查看甲骨文教程:Concurrency in Swing

例如,

import java.awt.*; 
import javax.sound.midi.*; 
import javax.swing.*; 

public class MidiFoo { 
    public static void main(String args[]) { 

     new Thread(new Runnable() { 
     public void run() { 
      try { 
       Receiver receiver = MidiSystem.getReceiver(); 
      } catch (MidiUnavailableException e) { 
       e.printStackTrace(); 
      } 
     } 
     }).start(); 

     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      JFrame frame = new JFrame("here's a frame"); 
      Dimension d = new Dimension(500, 500); 
      frame.setSize(d); 
      frame.setPreferredSize(d); 
      frame.setVisible(true); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     } 
     }); 
    } 
} 
+0

真棒,它的作品!非常感謝! – brandon 2013-04-28 20:06:37

+0

@ user2329839:不客氣。 – 2013-04-28 20:19:13