在一定间隔后更改jLabel中的图像

时间:2014-02-21 19:13:46

标签: java swing animation timer jlabel

我必须在netbeans gui中制作一种动画。所以我正在研究互联网上的摇摆计时器,以及我发现的一个方法,它会在一段时间后改变jLabel中的图像。

public void animation() throws InterruptedException {
    ActionListener taskPerformer = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent evt) {
            //...Perform a task...
            t++;
            System.out.printf("Reading SMTP Info. %d\n",t);
            if(t%2==1){
                jLabel3.setIcon(new javax.swing.ImageIcon(getClass().getResource("/oncsreen_keypad/a.jpg")));
            }
            else{
                jLabel3.setIcon(new javax.swing.ImageIcon(getClass().getResource("/oncsreen_keypad/b.jpg")));
            }
        }
    };
    Timer timer = new Timer( 1000 , taskPerformer);
    //timer.setRepeats(false);
    timer.start();

    Thread.sleep(5000);
}

此方法无处调用。但是如果System.out.printf工作,那么在jLabel中更改图像也应该有效。但实际上在运行中这些线对jLabel没有影响。

那么什么是正确的方法。

1 个答案:

答案 0 :(得分:2)

不要使用Thread.sleep ..停止主线程,使用Swing Timer并在图像发生变化时给予延迟。

我为你做了一个小例子。

这是使用JPanel生成JFrame的类,其中包含JLabel。

package timerdemo;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;

/**
 *
 * @author ottp
 * @version 1.0
 */
public class Gui extends JFrame {

    private JLabel jLabel;
    private Timer timer;
    private boolean chromeShown;

    public Gui() {
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(800, 600);
        JPanel panel = new JPanel(new BorderLayout());
        jLabel = new JLabel(new ImageIcon("/home/ottp/Downloads/chrome.png"));
        chromeShown = true;

        panel.add(jLabel);
        timer = new Timer(5000, new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if(chromeShown) {
                    jLabel.setIcon(new ImageIcon("/home/ottp/Downloads/ok.png"));
                    chromeShown = false;
                } else {
                    jLabel.setIcon(new ImageIcon("/home/ottp/Downloads/chrome.png"));
                    chromeShown = true;
                }
            }
        });
        timer.start();

        this.getContentPane().add(panel);
        this.setVisible(true);
    }
}

然后开始......

package timerdemo;

import javax.swing.SwingUtilities;

/**
 *
 * @author ottp
 */
public class TimerDemo {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Gui();
            }
        });

    }
}

在Gui类中启动计时器后,JLabel上的图像将每5秒更改一次,条件是布尔标志。您也可以在那里使用if ... else构造。

希望这有帮助

帕特里克