我在构建一个简单的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);
}
}
}
}
答案 0 :(得分:0)
如果dec()是你自己的删除秒的方法,那么当你按下按钮时只删除一秒是完全正常的。如果你想看到下降的计时器你应该使用swingworker分成两个线程。因此,在一个线程中,您将计数减少,并在每次删除之后,进行发布以更新gui。
答案 1 :(得分:0)
“唯一的问题似乎是我每次想要减少JButton时都要按一下。”
AtionListener
。它所做的只是检查源是否是按钮,因此源永远不会是定时器,这意味着对于发生的所有定时器事件,什么都不会发生。仅仅因为你调用它 TimerListener
并不能使它成为计时器的实际监听器。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分开。