我想在自定义MIDI播放器上实现重复功能,但我无法实现重复功能。以下是我正在使用的课程:向简单的MIDI播放器添加重复功能
NotePlayer
- 使用Java的MIDI包播放MIDI音符。
GuitarTunerGUI
- 接口到NotePlayer类。
- 为每个吉他字符串提供六个JButtons,用于选择所需调谐的JComboBox以及用于切换重复功能的JCheckBox。
- 提供
toggleRepeat()
用于切换repeatEnabled
字段,该字段是GuitarTunerGUI
类的私有字段。
我创建了一个SwingWorker,负责在单独的线程中播放MIDI音符。这解决了在笔记播放时保持GUI响应的问题。 但是,启用重复并且用户按下多个按钮时会出现问题。
当用户按下六个Jbutton将之一听者执行以下操作:
public void actionPerformed(ActionEvent event) {
// The note param is a private field of the listener object
MusicianWorker clapton = new MusicianWorker(note);
clapton.execute();
}
的执行方法执行以下操作:
protected Void doInBackground() throws Exception {
do {
NotePlayer.playNote(thisNote);
try {
Thread.sleep(3000);
} catch (InterruptedException ex) {
System.out.println(ex.getMessage());
}
} while (repeatEnabled);
return null;
}
当用户按压多个按钮没有问题出现切换重复。例如,当顺序按下'A'按钮和'E'按钮时,创建两个线程,并且'A'和'E'音符是两个都重复播放,直到repeatEnabled
被切换为止。当用户按下一个JButton时,我需要首先确定是否有任何工作线程正在执行,如果这样,在播放指定音符之前杀掉这些线程。预先感谢您的时间和反馈。
类似的问题被检查[这里](http://stackoverflow.com/q/17226579/230513Z)。 – trashgod