Java Swing计时器仅使用JButton触发一次
我在构建一个简单的Swing timer项目时遇到了一个问题。我正在尝试建立一个倒计时计时器。唯一的问题似乎是,每当我想减少一秒钟时,我必须按下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
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个不同的按钮,我会对每个按钮都这样做吗?