java计时器有问题吗?

时间:2011-10-25 15:18:53

标签: java swing

在另一个帖子的建议之后,我一直在玩计时器课,没有太大的乐趣。继承我的代码:

 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;

它现在正在做它应该做的事,但是计时器一直在继续,你做了什么,一旦你完成并希望它停止?!

5 个答案:

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

示例herehere

不要忘记停止Timer#stop(),或者只想运行此代码一次setRepeats(false)

答案 3 :(得分:0)

而不是在100ms之后调用repaint()(我认为应该是1000ms = 1s)以后更改组件1s。通过使用更改方法替换repaint()来执行此操作。

答案 4 :(得分:-1)

您可以使用

而不是创建新的计时器
Thread.sleep(1000);

替换

gameTimer.start();