Java 摆动计时器不停止
我正在使用swing计时器在Netbeans中创建倒计时时钟:Java 摆动计时器不停止,java,swing,timer,Java,Swing,Timer,我正在使用swing计时器在Netbeans中创建倒计时时钟: public void startTimer() { System.out.println(right + "value"); ActionListener listener = new ActionListener() { @Override public void actionPerformed(ActionEvent event) { System.ou
public void startTimer() {
System.out.println(right + "value");
ActionListener listener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
System.out.println("action");
timerLabel.setText("" + seconds);
--seconds;
System.out.println(seconds);
if (seconds == -1 && seconds < 0) {
System.out.print("zero");
//displayTimer.stop();
wrong();
dispose();
}
}
};
displayTimer = new Timer(1000, listener);
displayTimer.setInitialDelay(100);
displayTimer.start();
if (right == null) {
System.out.println("null");
} else if (right == true) {
System.out.println("truehere");
displayTimer.stop();
right = null;
seconds = 20;
displayTimer.setDelay(10000);
displayTimer.setInitialDelay(100);
displayTimer.start();
} else if (right == false) {
System.out.print("wrong");
//displayTimer.stop();
seconds = 20;
}
}
它不工作的权利,因为秒不显示,但它确实显示了20次,这是我想要的。这只是在它自己的应用程序中,在我的实际程序中更容易看到问题
我注意到游戏第一次运行时效果很好。然后我再次点击play(重置整个游戏),它的速度是原来的两倍。也许我没有正确地重置某些内容?这是我的重置代码:
// Reset Everything
PlayFrame.seconds = 20;
PlayFrame.winnings = 0;
PlayFrame.right = false;
//PlayFrame.displayTimer.stop();
PlayFrame.questionLabel.setText(null);
PlayFrame.count = 0;
WelcomeFrame WFrame = new WelcomeFrame();
WFrame.setVisible(true);
setVisible(false);
PlayFrame P = new PlayFrame();
P.dispose();
if (PlayFrame.seconds == -1 && PlayFrame.seconds < 0){
PlayFrame.displayTimer.stop();
}
}
//重置所有内容
PlayFrame.seconds=20;
PlayFrame.winnings=0;
PlayFrame.right=false;
//PlayFrame.displayTimer.stop();
PlayFrame.questionLabel.setText(空);
PlayFrame.count=0;
WelcomeFrame WFrame=新的WelcomeFrame();
WFrame.setVisible(true);
setVisible(假);
PlayFrame P=新的PlayFrame();
P.处置();
如果(PlayFrame.seconds==-1&&PlayFrame.seconds<0){
PlayFrame.displayTimer.stop();
}
}
这只是一段伪代码,用来查看计时器是如何启动和停止的
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import javax.swing.Timer;
public class TimerOnJLabel extends JFrame {
private static final long serialVersionUID = 1L;
long start = System.currentTimeMillis();
long elapsedTimeMillis;
int sec = 5;
Timer timer;
public TimerOnJLabel() {
super("TooltipInSwing");
setSize(400, 300);
getContentPane().setLayout(new FlowLayout());
final JLabel b1;
final JRadioButton jrb = new JRadioButton();
b1 = new JLabel("Simple tooltip 1");
ActionListener timerTask = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
elapsedTimeMillis = System.currentTimeMillis();
b1.setText("Timer : " + (elapsedTimeMillis-start)/1000+" ::::: " +sec);
System.out.println("Timer working: " + sec);
if(--sec == 0){
timer.stop();
System.out.println("Timer Stopped");
}
}
};
timer = new Timer(1000, timerTask);
System.out.println("Timer Started");
timer.start();
getContentPane().add(b1);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setVisible(true);
}
public static void main(String args[]){
new TimerOnJLabel();
}
}
我希望这有帮助。考虑发布一个。尝试删除这行
displayTimer.removeActionListener(listener)代码>这没有任何意义,您的所有活动只使用一个计时器实例。@HoverCraftfullOfels我不能,我一直在尝试,但我不能t@CodeAddict我有一个伪代码。但是我不确定这对你是否有帮助。变量right
应该做什么?答案中提供的信息是好的,+1表示这一点。无需添加一个WindowListener
来关闭JFrame
,只要编写frameObject这样简单的东西。setDefaultCloseOperation(JFrame.DISPOSE\u ON\u close)
就可以帮你完成。@GagandeepBali你说得对。但所有发生的事情都在构造函数中,在该代码中我没有frameObject
。此外,我只想演示如何启动和停止计时器,然后只需编写setDefaultCloseOperation(JFrame.DISPOSE\u ON\u CLOSE)/setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
,您通过添加WindowListener
:-)@GagandeepBali答案更新完成的操作。谢谢你提供的信息。我不怎么玩GUI,这就是为什么。
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import javax.swing.Timer;
public class TimerOnJLabel extends JFrame {
private static final long serialVersionUID = 1L;
long start = System.currentTimeMillis();
long elapsedTimeMillis;
int sec = 5;
Timer timer;
public TimerOnJLabel() {
super("TooltipInSwing");
setSize(400, 300);
getContentPane().setLayout(new FlowLayout());
final JLabel b1;
final JRadioButton jrb = new JRadioButton();
b1 = new JLabel("Simple tooltip 1");
ActionListener timerTask = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
elapsedTimeMillis = System.currentTimeMillis();
b1.setText("Timer : " + (elapsedTimeMillis-start)/1000+" ::::: " +sec);
System.out.println("Timer working: " + sec);
if(--sec == 0){
timer.stop();
System.out.println("Timer Stopped");
}
}
};
timer = new Timer(1000, timerTask);
System.out.println("Timer Started");
timer.start();
getContentPane().add(b1);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setVisible(true);
}
public static void main(String args[]){
new TimerOnJLabel();
}
}