2013-03-08 86 views
0

我有一款運行在JPanel之上的遊戲,其中有很多其他的東西都有自己的獨立計時器等等。看起來,當我試圖從我的框架中刪除面板以替換它與另一個JPanel它拒絕實際結束它自己的所有進程。所以,即使我能夠通過刪除它並將其設置爲null將其從面板的屏幕上移除,它的進程仍然會在後臺進行,IE瀏覽器會播放音樂以及周圍的東西。殺死所有進程,強制所有進程停止

我需要知道的是如何完全殺死這個JPanel並終止其整個生命的一些解決方案。

似乎沒有多少人遇到過這個問題。

回答

1

我記得我有我自己的遊戲,問題..

只需創建即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

1

試試這個:

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

相關問題