0

JPanel私は、独自の独立したタイマーなどを持つ他の多くのものを実行するゲームを持っています。フレームからパネルを取り外して別のパネルと交換しようとすると、JPanel実際にはすべてのプロセスを終了することを拒否しているようです。そのため、パネルを削除して設定することでパネルの画面から削除できたとしてもnull、そのプロセスはバックグラウンドでまだオフになっています。つまり、音楽や飛び交うものです。

私が知る必要があるのは、これを完全に殺し、JPanelその生命を完全に終わらせる方法に関するいくつかの解決策です.

この問題に遭遇した人はあまりいないようです。

4

2 に答える 2

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();
    }

}

または、パネルが表示されているかどうかを毎回チェックし、表示されていない場合は実行を停止することで、SwingTimersオブザーバーを作成することもできます。ただし、これにより、もちろん、パネルが表示されたときにのみ他のタイマーを開始するタイマーを作成できます。

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 に答える
1

これを試して:

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

音楽やその他のコンポーネントがパネル内にあることを確認して、それらも削除されるようにします。

于 2013-03-08T03:09:47.990 に答える