我正在尝试打开一个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)
非常感谢您的帮助。
答案 0 :(得分:1)
嗯,NullPointerException是您将遇到的最常见的异常,因此您需要学习如何调试堆栈跟踪。跟踪告诉您导致异常的行号,因此您需要找出哪个变量为空并修复它。我们无法访问您的代码,因此您需要进行调试。
几条评论:
处置窗户后,您不需要让窗户不可见。
Swing组件的更新应该在Event Dispatch Thread上完成,这意味着你应该使用Swing Timer
,而不是TimerTask来安排事件。