我正在编写一个涉及播放MIDI声音的程序,就在今天我遇到了调用
的问题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 :(得分:1)
您的Receiver正在踩踏Swing线程,阻止GUI运行。您必须在Swing事件线程或EDT背景的线程中运行Receiver( E vent D ispatch T hread)。有关这方面的更多信息,请查看Oracle教程: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);
}
});
}
}