2011-10-25 93 views
1

经过另一个线程的建议,我一直在玩定时器课,没有太多的快乐。下面有我的代码:Java定时器的麻烦?

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; 

现在做什么应该,但计时器不断去和去,你会怎么做一次你完成,并希望它停止?

回答

4

您设置图标,启动计时器,然后立即删除图标。来自定时器的start()方法几乎立即返回并且定时器将异步执行其任务。您需要在actionPerformed方法中删除图标。

+1

+1,对于速度更快且具有更好的解释,不要忘记停止你Timer#stop(),或。 – camickr

+1

如果我这样做,似乎把它放入一个循环,我不明白为什么? –

+0

@EricBanderhide你可以用更新的代码编辑你的文章吗?将其粘贴在当前代码后面以保持原始问题清晰。 –

0

而不是调用repaint()100ms以后(应该是1000ms = 1s,我认为)稍后更改组件1秒。通过用改变的方法替换repaint()来做到这一点。

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; 
-1

而不是创建一个新的计时器可以使用

Thread.sleep(1000); 

要更换

gameTimer.start(); 
+1

-1在Event Dispatch Thread上调用Thread.sleep()将会阻止GUI重绘自己,因此您仍然不会看到初始图标。 – camickr

1

你有点compicated简单的事情,

 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(); 

herehere

,如果你想运行此代码只有一次,然后setRepeats(false)