【发布时间】:2015-05-01 00:58:37
【问题描述】:
我正在尝试编写一个简单的 GUI,它可以在一个循环中连续显示一些颜色。当用户按下回车时,循环将停止在一个颜色处,并在再次按下回车时恢复。
我似乎遇到了一些问题。当我按回车键一次时,它会继续到数组中的最后一种颜色为黑色 - 当它应该停止在我按回车键的颜色时。当我再次按 Enter 键时,程序似乎只是挂起并且没有响应,然后抛出如下错误:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Timer already cancelled.
我使用Timer 和TimerTask 有错吗?
这是我的课程:
import java.awt.Color;
import java.awt.Container;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Calendar;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JFrame;
public class Rainbow extends JFrame {
public static final int PAUSED = 0;
public static final int PLAYING = 1;
private Timer timer;
private TimerTask task;
private int state;
private Color[] spectrum;
private Container c;
public static void main(String[] args) {
Rainbow r = new Rainbow();
}
public Rainbow() {
super("TASTE THE RAINBOW!");
createFrame();
setVisible(true);
timer = new Timer();
state = PLAYING;
task = new TimerTask() {
public void run() {
colorChange();
}
};
timer.schedule(task, Calendar.getInstance().getTime(), 1);
}
private void createFrame() {
c = getContentPane();
spectrum = new Color[] {Color.RED, Color.YELLOW, Color.GREEN, Color.BLUE, Color.BLACK};
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(500, 500);
c.setFocusable(true);
c.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_ENTER) {
if(state == PLAYING) {
System.out.println(1);
state = PAUSED;
timer.cancel();
} else {
System.out.println(2);
state = PLAYING;
timer.schedule(task, Calendar.getInstance().getTime(), 1);
}
}
}
});
}
private void colorChange() {
try {
while(state == PLAYING) {
for(int i = 0; i < spectrum.length; i++) {
c.setBackground(spectrum[i]);
Thread.sleep(1000);
}
}
} catch(Exception e) {
}
}
}
更新 2:
使用定时器类。
添加字段private Timer timer;
在构造函数中初始化
timer = new Timer(5000, new ActionListener() {
public void actionPerformed(ActionEvent e) {
colorChange();
}
});
timer.start();
colorChange() 删除了 while 循环。
问题:当您运行程序时,它会在灰屏上停留 5 秒钟,然后跳到黑色(最后一种颜色)并停留在那里。在执行 actionPerformed 期间 GUI 似乎没有更新?
【问题讨论】:
标签: java user-interface loops timer timertask