杀死所有进程,强制所有进程停止

问题描述:

我有一款运行在JPanel之上的游戏,其中有很多其他的东西都有自己的独立计时器等等。看起来,当我试图从我的框架中删除面板以替换它与另一个JPanel它拒绝实际结束它自己的所有进程。所以,即使我能够通过删除它并将其设置为null将其从面板的屏幕上移除,它的进程仍然会在后台进行,IE浏览器会播放音乐以及周围的东西。杀死所有进程,强制所有进程停止

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

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

我记得我有我自己的游戏,问题..

只需创建即destroy()一些自定义的方法,将停止所有计时器gameloops音乐等

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(); 
+0

感谢您的帮助 – Elton 2013-03-08 15:45:46

+0

'Thread.stop()'已被弃用。在GUI线程以外的任何线程上调用像Component.isVisible()这样的组件的方法也不是线程安全的。如果您要检查线程之间的布尔共享,请确保它声明为“volatile”。 – NovaDenizen 2013-03-08 18:22:46

+0

@NovaDenizen我从来没有使用线程。此外,因为它的一个摆动定时器我使用在edt上处理的动作,所以在我说明的代码中没有错。 – 2013-03-08 18:55:01

试试这个:

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

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

+0

是啊,我已经试过这,然后再试一次,remove();独立不工作以太。 我也尝试过myPanel = null; myFrame.remove(myPanel); myFrame.revalidate(); myFrame.repaint();当我这样做时,它至少从框架中删除面板,但音乐和打击检测和东西仍然继续处理。我正在考虑实际上正在通过并为所有停止所有活动定时器的对象制定一个主停止方法,但是它的很多工作,并且如果它不起作用,我恐怕会浪费时间。 – Elton 2013-03-08 03:44:56

+0

IMO你应该在'validate()'后调用'repaint()',否则可能不会反映更改。因此,我更喜欢'revalidate()'作为反映已添加或已删除组件的更改 – 2013-03-08 10:33:09