我正在进行棋盘游戏,在游戏的一部分中,我需要有这样的按钮,当点击时,会以1秒延迟间隔重复计算1到5的标签,之后会改变标签变成“完成”,但问题是它将标签更改为“完成”然后再计数。
btn.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
// @Override
public void run() {
count++;
if (count >= 6) {
timer.cancel();
timer.purge();
return;
}
lbl.setText(String.valueOf(count));
}
}, 1000,1000);
lbl.setText("done");
}});
答案 0 :(得分:0)
单击按钮时,将按顺序执行actionPerformed()方法:
然后,稍后,计时器完成其工作并将开始增加变量计数,每次更新按钮标签。像这样阅读应该有助于你理解发生了什么:计时器是在一个单独的线程中执行的。 timer.scheduleAtFixedRate()是一个非阻塞函数,它注册一个TimerTask以便稍后执行,并立即返回。
要解决您的问题,可以采用类似的解决方案:
btn.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
// @Override
public void run() {
count++;
if (count >= 6) {
timer.cancel();
timer.purge();
// We set the label to done only when the counter
// reaches the value 6, after button displayed 5
lbl.setText("done");
return;
}
lbl.setText(String.valueOf(count));
}
}, 1000,1000);
}});