我必须在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没有影响。
那么什么是正确的方法。
答案 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构造。
希望这有帮助
帕特里克