我有一个游戏,JPanel
它上面有许多其他的东西,它们有自己的独立计时器等等。似乎当我尝试从我的框架中移除面板以将其替换为另一个JPanel
时,它实际上拒绝结束它自己的所有进程。因此,即使我能够通过删除它并设置它来将它从面板屏幕上删除null
,它的进程仍然在后台运行,即音乐和飞来飞去的东西。
我需要知道的是一些关于如何完全杀死它JPanel
并完全终止它的生命的解决方案。
似乎没有多少人遇到过这个问题。
试试这个:
myFrame.getContentPane().remove(myPanel);
myFrame.validate();
确保您的音乐和其他组件在面板内,以便它们也被删除。
我记得在我自己的游戏中遇到过这个问题..
只需创建一些自定义方法,即destroy()
停止所有计时器游戏循环音乐等。
IE
MyPanel panel=new MyPanel();
...
panel.destory();//stop music, timers etc
frame.remove(panel);
//refresh frame to show changes
frame.revalidate();
frame.repaint();
面板将在哪里:
class MyPanel extends JPanel {
private Timer t1,t2...;
//this method will terminate the game i.e timers gameloop music etc
void destroy() {
t1.stop();
t2.stop();
}
}
或者,您可以让 Swing Timers成为各种观察者,方法是让它每次检查面板是否可见,如果不可见,它应该停止执行。这当然会导致您创建一个计时器,该计时器仅在面板可见时才启动其他计时器:
class MyPanel extends JPanel {
private Timer t1,t2,startingTimer;
MyPanel() {
t1=new Timer(60,new AbstractAction() {
@Override
public void actionPerformed(ActionEvent ae) {
if(!MyPanel.this.isVisible()) {//if the panel is not visible
((Timer)(ae.getSource())).stop();
}
}
});
startingTimer=new Timer(100,new AbstractAction() {
@Override
public void actionPerformed(ActionEvent ae) {
if(MyPanel.this.isVisible()) {//if the panel is visible
t1.start();//start the timers
t2.start();
((Timer)(ae.getSource())).stop();//dont forget we must stop this timer now
}
}
});
startingTimer.start();//start the timer which will check when panel becomes visible and start the others as necessary
}
}
现在你要做的就是:
frame.remove(panel);//JPanel timers should also see panel is no more visible and timer will stop
//refresh frame to show changes
frame.revalidate();
frame.repaint();