甚至在计时器发生时打开JFrame

时间:2014-05-05 14:38:33

标签: java swing timer jframe actionlistener

我正在尝试打开一个JFrame并在计时器中出现if语句时处理我当前的一个,我已经尝试将if窗口中的窗口直接插入设置为可见并尝试制作一个方法在if语句中调用,它应该打开和关闭框架,这两个框架都没有工作。任何帮助将不胜感激,这是相关的代码片段:

在课程顶部:

private DieWindow dieWindow;

再向下:

public void setAgeTimer() {
    int period = 10;
    int delay = 10;//7000
    ageBar.repaint();
    ageTimer = new Timer();
    ageTimer.scheduleAtFixedRate(new TimerTask() {
        public void run() {
            setAgeInterval();
        }
    }, delay, period);
}

//Interval method for age bar
public void setAgeInterval() {
    if(snowLeopard.getAge() < snowLeopard.getLifespan()) {
        ageInt++;   
        ageBar.setValue(ageInt);
        if (ageInt == 100) {
        snowLeopard.incAge();
        ageLabel.setText("I am " + snowLeopard.getAge() + " years old with");
        ageInt = 0;
    }
    }
    else if(snowLeopard.getAge() == snowLeopard.getLifespan()) { 
        ageTimer.cancel();
        terminate();
    }
}

public void terminate() {

        snowLeopardWindow.dispose();
        snowLeopardWindow.setVisible(false);
        dieWindow.getMainDieWindow().setVisible(true);

}

并且在dieWindow类中有:

public JFrame getMainDieWindow() {
    return mainDieWindow;
}

public DieWindow(int width, int height, SnowLeopard snowLeopard) {

    JFrame mainDieWindow = new JFrame();
    //mainDieWindow.setTitle("Your pet has died :(");
    mainDieWindow.setSize(width, height);
    mainDieWindow.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    this.snowLeopard = snowLeopard;

加上所有创建细节,例如高度,颜色等,我已经为这个类添加了一个main方法并运行它,窗口会弹出(main方法现在被注释掉了),所以我知道JFrame本身会工作并出现。

主程序运行正常,然后当它达到其年龄= 20的分配时间时,它会关闭,但是新窗口不会打开并且它会调用错误。

Exception in thread "Timer-12" java.lang.NullPointerException
at SnowLeopardInterface.terminate(SnowLeopardInterface.java:562)
at SnowLeopardInterface.setAgeInterval(SnowLeopardInterface.java:554)
at SnowLeopardInterface$8.run(SnowLeopardInterface.java:535)
at java.util.TimerThread.mainLoop(Unknown Source)
at java.util.TimerThread.run(Unknown Source)

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

嗯,NullPointerException是您将遇到的最常见的异常,因此您需要学习如何调试堆栈跟踪。跟踪告诉您导致异常的行号,因此您需要找出哪个变量为空并修复它。我们无法访问您的代码,因此您需要进行调试。

几条评论:

  1. 处置窗户后,您不需要让窗户不可见。

  2. Swing组件的更新应该在Event Dispatch Thread上完成,这意味着你应该使用Swing Timer,而不是TimerTask来安排事件。