我正在尝试在自定义 MIDI 播放器上实现重复功能,但我无法实现重复功能。以下是我正在使用的课程:
NotePlayer
- 使用 Java 的 MIDI 包播放 MIDI 音符。
GuitarTunerGUI
- NotePlayer 类的接口。
- 为每个吉他弦提供六个 JButton,一个用于选择所需调音的 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 时,我需要首先确定是否有任何工作线程当前正在执行,如果是,则在播放指定的音符之前终止这些线程。提前感谢您的时间和反馈。