0

我有一个游戏,JPanel它上面有许多其他的东西,它们有自己的独立计时器等等。似乎当我尝试从我的框架中移除面板以将其替换为另一个JPanel时,它实际上拒绝结束它自己的所有进程。因此,即使我能够通过删除它并设置它来将它从面板屏幕上删除null,它的进程仍然在后台运行,即音乐和飞来飞去的东西。

我需要知道的是一些关于如何完全杀死它JPanel并完全终止它的生命的解决方案。

似乎没有多少人遇到过这个问题。

4

2 回答 2

1

试试这个:

myFrame.getContentPane().remove(myPanel);
            myFrame.validate();

确保您的音乐和其他组件在面板内,以便它们也被删除。

于 2013-03-08T03:09:47.990 回答
1

我记得在我自己的游戏中遇到过这个问题..

只需创建一些自定义方法,即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();
于 2013-03-08T10:32:20.907 回答