我想在执行mediaPlayer()函数之前显示文本。在执行媒体播放器期间,我睡觉了。那没关系,因为之后不需要发生任何事情(然后只需要倾听)。
然而,最后一个文字:"收听...",没有显示(除了延迟几秒)。有没有办法在线程进入睡眠状态之前先刷新jFrame?
expText.setText("Listen to the song and give a rating when it finishes.");
startButton.setEnabled(false);
//play sound
try {
mediaPlayer();
//wait for the duration of the stimuli
Thread.sleep(stimDuration);
...
答案 0 :(得分:2)
setText不会显示,直到EDT渲染另一帧,因为它在stimDuration
的时间内忙着睡觉,所以不能这样做。
尝试在单独的线程上播放声音,在其他线程上播放声音,检测声音何时停止,然后在EDT上执行另一个操作,将expText
更改回原始文本了。
答案 1 :(得分:1)
下面结合使用Threads和Swing Timer解决了这个问题。
Thread t2 = new Thread(new Runnable() {
public void run() {
try {
startButton.setEnabled(false);
startButton.setVisible(false);
buttonsPanel.setEnabled(false);
buttonsPanel.setVisible(false);
expText.setText("Listen to the song and give a rating when it finishes.");
} catch (Exception e1) {
e1.printStackTrace();
}
}
});
t2.start();
Thread t1 = new Thread(new Runnable() {
public void run() {
// code goes here.
try {
mediaPlayer();
// Thread.sleep(5000);
} catch (Exception e1) {
e1.printStackTrace();
}
}
});
t1.start();
ActionListener taskPerformer = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
//...Perform a task...
resultButtonGroup.clearSelection();
startButton.setEnabled(true);
startButton.setVisible(true);
buttonsPanel.setVisible(true);
}
};
Timer timer = new Timer(stimDuration ,taskPerformer);
timer.setRepeats(false);
timer.start();