计数器关闭JFrame,打开确认对话框



这篇文章与我上一篇关于计时器的文章有关。我决定要立即获得结果,最简单的方法就是编写一个计数器线程,从特定时间开始计数(在本例中为5秒),如果计数器达到0,JFrame关闭,并让用户知道时间已经过期。

然而,我遇到了一些麻烦。当计数器达到0时,我似乎无法使JFrame关闭。我不确定我是否错过了一些愚蠢的东西,或者我是否误解了线程的工作方式和jframe的工作方式。这是代码,让我知道你的想法。

顺便说一句,我知道使用挥杆可能是最有效的。计时器,但我还不太明白它们的本质。我在自己设定的时间限制下(我不是学生什么的,我只是想保持动力),所以我现在"操纵"这件事。

不管怎样,继续看代码!

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的构造函数代码,计时器位于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();
    }

这在swing timer的帮助下很容易做到。请看下面的代码示例:

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分派线程中运行。如果你不想挂起你的GUI,确保你在另一个线程上运行这个计时器,当你在处理JFrame时用swingutility . invokelater()包装调用——这确保了调用在事件调度线程上排队。

我认为你的代码不工作,因为同样的原因,你试图在事件调度线程中没有排队的东西。这篇文章会让你走得更远

http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html

最新更新