Java Swing Timer仅使用JButton触发一次

时间:2014-01-19 00:01:23

标签: java swing timer

我在构建一个简单的Swing计时器项目时遇到了问题。我正在尝试建立一个倒计时器。唯一的问题似乎是每次我想要减少一秒时我必须按下JButton。当我按下'start'JButton时,我希望Timer启动并保持运行状态。任何帮助是极大的赞赏。

package package1;
import java.awt.event.*;

import javax.swing.*;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;




public class MyTimerPanel extends JPanel {

    private Timer javaTimer1;
    private JButton start1;
    private JLabel label;   
    private JLabel timer1;
    private TimerListener listener;
    private  int count = 30;


    public MyTimerPanel() 
    {

        label = new JLabel("Timer");
        timer1 = new JLabel("timer1");
        javaTimer1 = new Timer(1000, listener);
        listener = new TimerListener();
        javaTimer1.addActionListener(listener);

        javaTimer1.start();
        javaTimer1.setRepeats(true);



        timer2 = new JLabel("timer2");
        timer3 = new JLabel("timer3");


        start1 = new JButton("Start Timer 1");
        start1.addActionListener(listener);



        //Add
        add(label);
        add(timer1);

        add(start1);

    }       


    public class TimerListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            if( e.getSource() == start1)
            {

                count--;
                timer1.setText("" + count);


            }

        }

    }
}       

3 个答案:

答案 0 :(得分:0)

如果dec()是你自己的删除秒的方法,那么当你按下按钮时只删除一秒是完全正常的。如果你想看到下降的计时器你应该使用swingworker分成两个线程。因此,在一个线程中,您将计数减少,并在每次删除之后,进行发布以更新gui。

答案 1 :(得分:0)

  

“唯一的问题似乎是我每次想要减少JButton时都要按一下。”

  • 看看你的AtionListener。它所做的只是检查源是否是按钮,因此源永远不会是定时器,这意味着对于发生的所有定时器事件,什么都不会发生。仅仅因为你调用它 TimerListener并不能使它成为计时器的实际监听器。
  • 为按钮使用不同的侦听器,您可以使用它在计时器中调用start。并在TimerListener
  • 中取出来源检查

像这样的东西。我所做的只是取出TimerListener中的按钮检查,并给按钮自己的启动定时器的谎言,它工作正常。

import javax.swing.*;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class TestTimer extends JPanel {

    private JButton start1;
    private JLabel label;
    private JLabel timer1;
    private TimerListener listener;
    private int count = 30;
    private Timer javaTimer1 = new Timer(1000, null);

    public TestTimer() {

        label = new JLabel("Timer");
        timer1 = new JLabel("timer1");
        javaTimer1 = new Timer(1000, new TimerListener());
        javaTimer1.setRepeats(true);

        start1 = new JButton("Start Timer 1");

        add(label);
        add(timer1);
        add(start1);

        start1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                javaTimer1.start();
            }
        });
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new TestTimer());
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.pack();
                frame.setVisible(true);
            }
        });
    }

    public class TimerListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            if (count == 0) {
                javaTimer1.stop();
            } else {
                count--;
                timer1.setText("" + count);
            }
        }
    }
}

答案 2 :(得分:0)

您需要将ActionListeners分开。

  1. 您将ActionListener添加到按钮。这个ActionListener只是启动Timer。
  2. 使用第二个ActionListener创建Timer。这个ActionListener减少了时间。