1

JPanel 内で呼び出されるメソッドを無効にすることに問題があります。フレームのグラフィックスを制御する 2 つの JPanel を使用してフレームをセットアップしました。問題は、Frame に新しい JPanel を作成し、以前そこにあった古い JPanel も削除した場合、古い JPanel の paint メソッドが引き続き呼び出されることです。

これをテストするために使用したコードは次のとおりです。

開始クラス:

    import java.awt.Frame;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.awt.event.WindowEvent;
    import java.awt.event.WindowListener;

    public class Start implements WindowListener, KeyListener{
        public static void main(String[] args) {
            new Start();
        }

        Frame frame = new Frame("Frame");

        TestPanel P1 = new TestPanel();
        TestPanel P2 = new TestPanel();

        static boolean active = true;

        public Start() {
            frame.setSize(500,500);
            frame.setLocationRelativeTo(null);
            frame.addWindowListener(this);
            frame.addKeyListener(this);
            frame.setVisible(true);
            frame.add(P1);
            for (Object c : frame.getComponents()){
                System.out.println(c.toString());
            }
        }

        @Override
        public void keyPressed(KeyEvent e) {
            if (active){
                frame.remove(P1);
                    frame.add(P2);
            }else{
                frame.remove(P2);
                frame.add(P1);
            }
            active = !active;
            for (Object c : frame.getComponents()){
                System.out.println(c.toString());
            }
        }

        @Override
        public void windowClosing(WindowEvent e) {
            System.exit(0);
        }

        public void windowOpened(WindowEvent e) {}
        public void windowClosed(WindowEvent e) {}
        public void windowIconified(WindowEvent e) {}
        public void windowDeiconified(WindowEvent e) {}
        public void windowActivated(WindowEvent e) {}
        public void windowDeactivated(WindowEvent e) {}
        public void keyTyped(KeyEvent e) {}
        public void keyReleased(KeyEvent e) {}
    }

TestPanel クラス:

    import java.awt.Graphics;
    import javax.swing.JPanel;


    public class TestPanel extends JPanel{
        boolean active = Start.active;

        @Override
        public void paint(Graphics g) {
            System.out.println(active);
        }
    }

このプログラムは、オブジェクト P1 のみがアクティブであり、画面に表示されていても P2 は何もしていないことを示す「true」を常に出力します。

だから私が求めているのは、P1オブジェクトが画面上にないときに呼び出されるペイントメソッドを取得するのをやめ、P2オブジェクトが表示されているときにペイントメソッドが呼び出されるようにする方法です。

4

3 に答える 3

2

から始めましょう

TestPanel P1 = new TestPanel();
TestPanel P2 = new TestPanel();

P1P2は同じクラスの個別のインスタンスです。

見て

static boolean active = true;

// From TestPane
public void paint(Graphics g) {
    System.out.println(active);
}

したがって、画面上のどのパネルに関係なく、常に値activeが表示されます。

オブジェクトのさまざまなインスタンスを実際に識別する手段を提供していないので、P1実際に呼び出され始めていることをどのようにして知ることができますか?

于 2012-12-19T23:30:57.743 に答える
1

おそらく、FrameのremoveメソッドがMenuComponent用であるためです。http://docs.oracle.com/javase/6/docs/api/java/awt/Frame.html#remove%28java.awt.MenuComponent%29 ...正しい方法は、frame.getContentPaneを使用してコンポーネントを追加することです。 ().add(P1)。frame.getContentPane()。remove(P1)を試して、機能するかどうかを確認してください。

于 2012-12-19T23:44:35.157 に答える
1

各パネルのローカル変数「アクティブ」は参照ではなく、プリミティブです。この値は、パネルの作成時に「Start」クラスでたまたま設定された静的な値に設定されます。あなたが示したコードのどちらが、両方の Panel インスタンスに対して「true」です。これは、コードによって常に「true」が出力される理由を説明しています。

表示の問題に関しては、remove 関数の JavaDoc に注意してください。

注: 表示されていたコンテナからコンポーネントが削除された場合、そのコンテナで validate() を呼び出して変更を反映する必要があります。複数のコンポーネントを削除する場合は、すべてのコンポーネントを削除した後で、validate() を 1 回だけ呼び出すことで効率を改善できます。

于 2012-12-19T23:40:57.280 に答える