我知道设置一个在线程停止运行之前一直运行的while循环并不是一个好习惯,但我已经用完了其他想法。然而,即使我诉诸于此(或类似的东西),我仍然无法让我的程序正常运行。
这是我的代码:
public void phase1() {
phase1CompoundLabels = new JLabel[numberOfElements];
okToShowAlternatives = false;
remove(btnNewButton);
revalidate();
repaint();
while (totalNoOfPhase1Trials > 399) {
Phase1Trial phase1Trial = new Phase1Trial(numberOfElements, elementColors);
// this displays a set of images
displayComplexStimulus(phase1Trial.getComplexStimulus());
validate();
// after calling this method the images get removed after two
// seconds and the okToShowAlternatives variable gets its value
// changed to true
removeElementsAfterInterval(2000, phase1CompoundLabels);
// while(okToShowAlternatives == false){
// }
// calling this method displays two images
// displayAlternatives(phase1Trial.getcorrectImage(),
// phase1Trial.getincorrectImage(),
// phase1Trial.getcorrectElementIsOnLeft());
private void removeElementsAfterInterval(int milliseconds, JLabel[] labels) {
Thread compoundThread = new Thread(new Runnable() {
public void run() {
try {
Thread.currentThread().sleep(milliseconds);
for (int i = 0; i < labels.length; i++) {
remove(labels[i]);
revalidate();
repaint();
}
okToShowAlternatives = true;
System.out.println("OkToShowAlternatives: " + okToShowAlternatives);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
Thread.currentThread().interrupt();
}
}
});
compoundThread.start();
}
使用while循环(在条件中具有OkToShowAlternatives的那个)和displayAlternatives()方法调用注释掉,如图所示,直到该点的程序工作正常,因为图像集显示两秒然后从jpanel中删除。但是,当我包含while循环时,程序停止显示图像集,我甚至无法关闭jframe。它完全没有反应。
但是当我包含一个print语句来查看OkToShowElements变量的值是否变为true时,它确实如此。那么,不应该再满足while循环的条件,因此退出while循环并继续下一部分代码吗?
答案 0 :(得分:0)
不允许您与其他线程中的Swing组件进行交互。由于Swing是单线程设计的,因此如果您从与UI线程不同的线程中与Swing中的组件树进行任何交互,则可以获得各种竞争条件和内存可见性问题。
使用Swing Timers在指定的延迟后执行Swing UI线程上的代码:
ActionListener executeThisAfterDelay = ...;
Timer timer = new Timer(speed, executeThisAfterDelay);
timer.setInitialDelay(pause);
timer.start();
有关进一步参考,请参阅Oracle网站上的How To Use Swing Timers Java教程。