我有一个用于不同显示目的的多面板框架,其中一个用于显示由预定时间任务执行的时间倒计时字符串:
private class TimerPad extends JPanel {
private int timeLeft = 60;
private String prefix = "Time Left: ";
TimerPad() {
setDoubleBuffered(true);
}
public void start() {
new java.util.Timer().schedule(new TimerTask() {
@Override
public void run() {
if (gameStatus == BoardStatus.JUDGING) {
this.cancel();
} else if (timeLeft == 0) {
submitCards(cardsSouth);
this.cancel();
} else {
timeLeft--;
repaint();
}
}
}, 1000, 1000);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
.....
}
@Override
public Dimension getPreferredSize() {
return new Dimension(240, 50);
}
}
这个面板被添加到主框架中,它的 start() 方法在外部请求时触发。现在,如果正常的 60 秒过去了,timePad 似乎运行良好,但是当我使用按钮(即提交)尝试更早取消任务时,所有 GUI 都被冻结......我试图为任务包装一个跑步者但是结果是一样的……