杀死所有进程,迫使一切停止

时间:2013-03-08 02:51:37

标签: java swing object jframe jpanel

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

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

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

2 个答案:

答案 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();