【问题标题】:Counter to Close JFrame, bring up Confirm Dialog计数器关闭 JFrame,弹出确认对话框
【发布时间】:2011-09-26 16:12:59
【问题描述】:

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

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

顺便说一句,我知道使用 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();
    }

【问题讨论】:

  • 为什么要关闭 JFrame?为什么不干脆停止游戏,也许会变成黑色或显示不同的视图?让 JFrame 进出对我来说似乎有点粗略。
  • 这是我计划实施的。我是一步一步地自学 Java,所以我喜欢在完全理解基础知识后获得简单的结果并将其扩展为更复杂的结果。
  • 看起来if(timesUp==true) 代码位于构造函数中,该构造函数仅在 jFrame 初始化时运行一次。 @sethu 的回答是处理这个问题的最好方法。对于如何处理这类事情,可能还值得研究 game loop 的概念。
  • @thedaian 这很有帮助。我喜欢了解为什么我正在做的事情不起作用。非常感谢你。我一定会看game loop

标签: java timer jframe counter


【解决方案1】:

这很容易在摆动计时器的帮助下完成。请参阅此代码示例:

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

【讨论】:

  • 这些链接非常有用。我想将这个问题留待更多时间来查看其他建议,但这是一个很好的答案。
  • 好像你一针见血!毕竟不需要打开它。
  • 遇到了timer.stop();的问题,说局部变量timer可能没有初始化。
  • 很高兴知道它有帮助 :).. 如果您收到该错误,则意味着您创建了一个计时器但没有对其进行初始化。尝试至少将 timer 变量设置为 null。看不到代码时很难说。尝试先将其初始化为 null .. 如果它不起作用,请发布一些代码..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多