我使用计时器每秒更改JLabel中的图标。 我在GUI构造函数中初始化并启动了计时器:
images[0] =new ImageIcon(getClass().getResource("connected.png"));
images[1] =new ImageIcon(getClass().getResource("notConnected.png"));
imageAnimator = new Timer(1000, animateImages());
imageAnimator.start();
并将计时器调用的方法包装在swingWorker线程中:
private ActionListener animateImages() {
System.out.println("in animateIMages method");
SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>(){
protected Void doInBackground() throws Exception {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
System.out.println("In swingworker ");
if (currentImage==0) {
currentImage=1;
connectionStatusLabel.setIcon(images[currentImage]);
System.out.println("in if currentImage==0: currentIMage should now be 1: "+ currentImage);
}
else {
currentImage=0;
connectionStatusLabel.setIcon(images[currentImage]);
System.out.println("in if else: currentIMage should now be 0: "+ currentImage);
}//end else
return null;
}
};//end worker thread
但是,只有在执行第一个if语句的位置时,图像才会更改。 提前致谢
答案 0 :(得分:2)
并将计时器调用的方法包装在swingWorker线程中:
你不想这样做。 GUI的所有更新都应在EDT中完成。 SwingWorker中的代码在一个单独的Thread中执行,这不是你想要的。
如果您正在从磁盘读取图像,那么您唯一可以使用SwingWorker进行此操作。然后工作器代码将读取图像,然后发布()结果。在您的情况下,看起来Icon已经在内存中,因此不需要SwingWorker。
只需使用Timer并直接在ActionListener中交换Icon。
答案 1 :(得分:0)
知道了。 在Timer构造函数中使用了一个非常规的ActionListner内部类并且工作正常:
imageAnimator = new Timer(1000, new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
//change images here
感谢您的投入。 ç