在另一个帖子的建议之后,我一直在玩计时器课,没有太大的乐趣。继承我的代码:
public void buttonImageReveal(ActionEvent e){
Timer gameTimer = new Timer(100, new ActionListener() {
public void actionPerformed(ActionEvent e) {
repaint();
}
});
String temp = e.getActionCommand();
switch(temp){
case "1":
System.out.println("case1");
((JButton)e.getSource()).setIcon(one);
gameTimer.start();
((JButton)e.getSource()).setIcon(null);
break;
我想要的只是图像之间的1秒间隙,图像显示为图标然后被删除。只有在按下按钮时才会发生一次。目前我按下时只得到一个空白按钮?
TIA
编辑:
public void actionPerformed(ActionEvent e) {
System.out.println(e);
lastImage();
}
});
public void buttonImageReveal(ActionEvent e){
String temp = e.getActionCommand();
switch(temp){
case "1":
((JButton)e.getSource()).setIcon(one);
lastBtn = ((JButton)e.getSource());
gameTimer.start();
break;
它现在正在做它应该做的事,但是计时器一直在继续,你做了什么,一旦你完成并希望它停止?!
答案 0 :(得分:4)
您可以设置图标,启动计时器,然后立即删除图标。来自计时器的start()
方法几乎立即返回,并且计时器将异步执行其任务。您需要在actionPerformed
方法中删除图标。
答案 1 :(得分:1)
尝试在计时器触发时将图标设置为null。我已经更新了原始帖子。 所以代码应该是:
public void buttonImageReveal(final ActionEvent e){
Timer gameTimer = new Timer(100, new ActionListener() {
public void actionPerformed(ActionEvent e) {
((JButton)e.getSource()).setIcon(null);
}
});
String temp = e.getActionCommand();
switch(temp){
case "1":
System.out.println("case1");
((JButton)e.getSource()).setIcon(one);
gameTimer.start();
break;
答案 2 :(得分:1)
timer1 = new Timer(1000, new AbstractAction() {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
random = new Random();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
button1.setSomething(something);
button1.validate(); //not required for all methods
button1.repaint(); //not required for all methods
}
});
}
});
timer1.setDelay(500);
timer1.setRepeats(true);
timer1.start();
不要忘记停止Timer#stop()
,或者只想运行此代码一次setRepeats(false)
答案 3 :(得分:0)
而不是在100ms之后调用repaint()(我认为应该是1000ms = 1s)以后更改组件1s。通过使用更改方法替换repaint()来执行此操作。
答案 4 :(得分:-1)
您可以使用
而不是创建新的计时器Thread.sleep(1000);
替换
gameTimer.start();