这篇帖子与我有关计时器的最后一篇有关。我认为,要立即获得结果,最简单的方法就是编写一个从特定时间(在本例中为5秒)开始递减计数的Counter线程,如果计数器达到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();
    }

最佳答案

借助swing计时器,可以轻松做到这一点。请参见以下代码示例:

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的构造函数中。如果您不希望挂断GUI,请确保在另一个线程上运行此计时器,并且在处置JFrame时,请使用SwingUtilities.invokeLater()包裹调用,以确保该调用在事件发送线程上排队。

我认为您的代码由于相同的原因而无法正常工作,即您尝试在事件发送线程中执行的操作未排队。这是一篇文章,可以助您一臂之力

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

关于java - 计数器关闭JFrame,弹出确认对话框,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7558017/

10-15 03:01