Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Swing计时器仅使用JButton触发一次_Java_Swing_Timer - Fatal编程技术网

Java Swing计时器仅使用JButton触发一次

Java Swing计时器仅使用JButton触发一次,java,swing,timer,Java,Swing,Timer,我在构建一个简单的Swing timer项目时遇到了一个问题。我正在尝试建立一个倒计时计时器。唯一的问题似乎是,每当我想减少一秒钟时,我必须按下JButton。我想定时器启动并保持运行,一旦我按下“开始”按钮。非常感谢您的帮助 package package1; import java.awt.event.*; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListen

我在构建一个简单的Swing timer项目时遇到了一个问题。我正在尝试建立一个倒计时计时器。唯一的问题似乎是,每当我想减少一秒钟时,我必须按下JButton。我想定时器启动并保持运行,一旦我按下“开始”按钮。非常感谢您的帮助

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


            }

        }

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

“唯一的问题似乎是,每当我想减少一秒钟时,我都必须按下JButton。”

  • 查看您的
    侦听器
    。它所做的只是检查源是否是按钮,因此源永远不会是计时器,这意味着对于所有发生的计时器事件,不会发生任何事情。仅仅因为你称它为
    TimerListener
    并不能使它成为计时器的实际侦听器
  • 为按钮使用不同的侦听器,在该按钮中,您可以使用它调用计时器中的start。并在
    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);
            }
        }
    }
}

您需要分离ActionListeners

  • 将ActionListener添加到按钮。这个ActionListener只是启动计时器
  • 使用第二个ActionListener创建计时器。此ActionListener递减时间

  • 什么是“倒计时”
    ?要更快地获得更好的帮助,请发布一个。MCVE需要一个
    main(String[])
    才能将其显示在屏幕上,但要了解更多详细信息,请查看文档。CountDownTimer是我创建的一个对象。这将创建一个类似“00:01:25”的时间,然后我有一个dec()方法来删除一秒。我认为问题在于JButton和action-event的关系,按钮不是ActionEvent的来源。向代码中添加System.out.println(…)语句以查看源代码。还显示if语句内部的输出,以查看代码是否正在执行。这些是在发布问题之前应该使用的基本问题解决技巧
    什么是倒计时?
    在上一篇关于此主题的帖子()中,您被问到了这个问题。为什么你一直发布我们无法编译的代码?循环中的代码正在执行。如果我放入一个sysout语句,它将打印一次,然后终止。我的计时器从00:00:15开始。当我点击开始1按钮时,标签变为00:00:14,然后当我再次点击到…13等。倒计时正在工作,只是它需要我每次点击按钮。很抱歉我一直在写倒计时,这是我的第二篇文章。我将对它进行编辑,使其尽可能简单,我真的不明白你所说的“它不是源代码”是什么意思。但如果我从图片中删除JButton,并只保留以下内容,那么jframe中的timer1标签将更新并完美工作。它每秒钟倒数一次
    public类TimerListener实现ActionListener{public void actionPerformed(ActionEvent e){a.dec();timer1.setText(a.toString();}}}
    ,但您已经说过它需要您点击才能更新,使用swing worker,你可以按下按钮一次,标签就会改变,直到倒数为零。好的,我可以试试。我真的不知道如何更新GUI,你有任何链接或建议,我可以在那里查找这些东西吗?谢谢如果你在谷歌上搜索,你会发现很多文章;基本上,您定义了一个实现swing worker重写三个主要方法的类,并在您的操作侦听器中创建swing worker并启动它。这非常有效。非常感谢。如果我有3个不同的计时器和3个不同的按钮,我会对每个按钮都这样做吗?