这篇文章与我关于计时器的最后一篇文章有关。我决定最直接的结果就是写一个Counter线程从一定时间开始倒计时(在这种情况下是5秒),如果计数器达到0,JFrame关闭,让用户知道时间已经过期。
然而,我遇到了一些麻烦。当计数器达到0时,我似乎无法使JFrame关闭。我不确定我是否遗漏了一些愚蠢的东西,或者我是否误解了线程的工作方式和JFrames的工作方式。这是代码,让我知道你的想法。另一方面,我知道使用swing.Timer可能是最有效的,但我还没有完全掌握它们的本质。我受到自我约束的时间限制(我不是学生或任何事情,我只是喜欢保持动力)因此我现在“偷偷摸摸”这件事。
无论如何,关于代码!
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
public class RacerDoom extends JFrame {
boolean timesUp=false;
public RacerDoom() {
//create JFrame
super("Racer Doom Squared");
setSize(WIDTH,HEIGHT);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
if(timesUp==true) {
dispose();
JOptionPane.showConfirmDialog(null, "Time's Up! Click Okay to try again!");
}
Counter c1 = new Counter();
c1.start();
//Counter
private class Counter extends Thread {
public Counter() {}
public void run() {
for(int i=5;i>=0;i--) {
if(i==0) {
timesUp=true;
}
System.out.println(i);
try{
Thread.sleep(1000);
}
catch(InterruptedException e){}
}
}
}
...
编辑:我已经实现了计时器并且正在运行。它完全符合我的需要,但我无法使timer.stop();
命令工作。我收到错误“本地变量计时器可能尚未初始化。
就像我说的那样,计时器工作,直到程序终止才会停止工作。以下是计时器所在的JFrame的构造函数代码。
int counter = 0;
public RacerDoom() {
//create JFrame
super("Racer Doom Squared");
setSize(WIDTH,HEIGHT);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
final Timer timer=new Timer(1000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(counter>=10) {
timer.stop(); //the error occurs here
dispose();
JOptionPane.showConfirmDialog(null, "Time's Up!");
}
else{
counter++;
}
System.out.println(counter);
}
});
//inner thread
Move1 m1 = new Move1();
m1.start();
timer.start();
}
答案 0 :(得分:4)
借助摆动计时器,这很容易做到。请参阅此代码示例:
final java.swing.Timer timer=new Timer(1000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(counter>5) {
timer.stop();
<dispose the fram here>
}else{
counter++;
}
}
});
timer.start();
我将此代码放在我的JFrame的构造函数中,该构造函数将在Event despatch线程中运行。如果您不想挂断GUI,请确保在另一个线程上运行此计时器,并且当您使用SwingUtilities.invokeLater()处理JFrame包装调用时 - 这可确保调用在事件发送线程上排队。 / p>
我认为你的代码不能正常工作,你尝试的东西在事件发送线程中没有排队。这是一篇可以帮助你的文章
http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html