我最近学会了如何使用计时器java类,并创建了一个使用计时器倒计时的程序,并使用标签显示此倒计时。我的问题是该程序倒计时为2而不是1。
package test;
import java.awt.*;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.Timer;
import static javax.swing.UIManager.get;
public class Test extends JFrame implements ActionListener{
//Declare Global Variable
int timerValGlobal = 25;
//Define components to add
JButton startTimer = new JButton("Start Timer");
JButton exitButton = new JButton("Exit");
JLabel time = new JLabel();
Timer timer = new Timer(1000, this);
//Define panels
JPanel pane = new JPanel();
JPanel exitPane = new JPanel();
public Test(){
setExtendedState(JFrame.MAXIMIZED_BOTH);
setUndecorated(true);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
//Add buttons to panels
pane.add(startTimer);
pane.add(time);
exitPane.add(exitButton);
//Add panels to form;
add(pane, BorderLayout.NORTH);
add(exitPane, BorderLayout.SOUTH);
//Add ActionListeners to Buttons
startTimer.addActionListener(this);
exitButton.addActionListener(this);
timer.addActionListener(this);
}
public static void main(String[] args) {
Test t = new Test();
}
public void actionPerformed(ActionEvent evt){
Object source = evt.getSource();
if(source == exitButton){
System.exit(0);
}
else if(source == startTimer){
timer.start();
}
else if (source == timer){
time.setText(String.valueOf(timerValGlobal));
timerValGlobal = timerValGlobal - 1;
if(timerValGlobal == 0){
timer.stop();
timerValGlobal = 25;
}
}
}
}
答案 0 :(得分:0)
这肯定是难以察觉的错误! (至少对我来说:D)
当你创建计时器时,你做到了,对吧?
Timer timer = new Timer(1000, this);
为什么在这段代码中写下this
这个词?您说this
应该用作计时器的动作侦听器,以便每秒都调用该类中的一个方法。正确?
现在,这里出错了。在构造函数中,再次将this
设置为动作侦听器!
public Test(){
setExtendedState(JFrame.MAXIMIZED_BOTH);
setUndecorated(true);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
//Add buttons to panels
pane.add(startTimer);
pane.add(time);
exitPane.add(exitButton);
//Add panels to form;
add(pane, BorderLayout.NORTH);
add(exitPane, BorderLayout.SOUTH);
//Add ActionListeners to Buttons
startTimer.addActionListener(this);
exitButton.addActionListener(this);
// LOOK! THIS LINE!
// VVVVVVVVVVVVVVV
timer.addActionListener(this);
}
你甚至写了一些评论,说下面的代码块用于向 按钮添加动作监听器 !
由于两个相同的动作侦听器,actionPerformed
方法每秒调用两次,因此输出!
只需删除添加第二个动作侦听器的行!
旁注,您应该在事件队列中创建框架,如下所示:
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new Test();
}
});
}
或者,在Java 8中:
public static void main(String[] args) {
EventQueue.invokeLater(Test::new);
}