计时器对象不会为图像设置动画

时间:2013-11-30 20:58:04

标签: java animation timer

我使用计时器每秒更改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语句的位置时,图像才会更改。 提前致谢

2 个答案:

答案 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

感谢您的投入。 ç