我有一个运行JPanel
的游戏,其上还有许多其他具有独立计时器的游戏。似乎当我尝试从我的框架中移除面板以用另一个JPanel
替换它时,它拒绝实际结束它自己的所有进程。因此,即使我能够通过删除它并将其设置为null
来从面板的屏幕中删除它,它的进程仍然在后台,IE音乐和飞来飞去的东西。
我需要知道的是如何完全杀死这个JPanel
并终止其生命的一些解决方案。
似乎没有多少人遇到过这个问题。
答案 0 :(得分:1)
试试这个:
myFrame.getContentPane().remove(myPanel);
myFrame.validate();
确保您的音乐和其他组件位于面板内,以便将其删除。
答案 1 :(得分:1)
我记得在我自己的游戏中遇到过这个问题..
只需创建一些自定义方法,即destroy()
即可停止所有计时器游戏圈音乐等。
即
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();