1. ホーム
  2. ジャワ

[解決済み] JFrameからJPanelを削除するにはどうすればよいですか?

2022-03-03 05:04:25

質問

最近、ここで質問したこと JFrameに新しいJPanelを追加する方法 . その答えは、私が動作するコードを得るのを助けました。しかし、私は関連する質問があります: "どのように私は古いJPanelを削除することができます"。私は次の問題のためにそれを必要とします。

新しいJPanelは、私が望むときに表示されます(時間制限を超えるか、ユーザーが"Submit"ボタンを押すかどちらか)。しかし、数秒後に、古いJPanelのいくつかの要素が、新しいJPanelのコンポーネントと一緒に表示されます。私はそれが起こる理由を理解していません。

私は、ウィンドウを更新する他のスレッドがあるためだと思いました。しかし、最初のスレッドは、古いパネルを一度追加するだけです(だから、それは終了しているはずです)。そして、2番目のスレッドで、私は壊れているループを持っています(だから、それはまた終了するはずです)。

以下は私のコードです。

private Thread controller = new Thread() {
    public void run() {
        // First we set the initial pane (for the selection of partner).
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                frame.getContentPane().add(generatePartnerSelectionPanel());
                frame.invalidate();
                frame.validate();
            }
        });
        // Update the pane for the selection of the parnter.
        for (int i=40; i>0; i=i-1) {
            final int sec = i;
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    timeLeftLabel.setText(sec + " seconds left.");
                }
            });
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) { }

            if (partnerSubmitted) {
                break;
            }
        }
        // For the given user the selection phase is finished (either the time is over or form was submitted).
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                frame.getContentPane().add(generateWaitForGamePanel());
                frame.invalidate();
                frame.validate();
            }
        });

    }
};

解決方法は?

コンテナ(フレーム)からコンポーネント(パネル)を削除する最も簡単な方法は、そのコンポーネントへの参照を保持し、次に Container.remove(Component) すなわち

private Thread controller = new Thread() {
public void run() {

        final Component panel1 = generatePartnerSelectionPanel();

        // First we set the initial pane (for the selection of partner).
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                frame.getContentPane().add(panel1);
                frame.invalidate();
                frame.validate();
        }
        });
        // Update the pane for the selection of the parnter.
        for (int i=40; i>0; i=i-1) {
            final int sec = i;
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    timeLeftLabel.setText(sec + " seconds left.");
                }
            });
            try {Thread.sleep(1000);} catch (InterruptedException e) {}
            if (partnerSubmitted) {break;}
        }
        // For the given user the selection phase is finished (either the time is over or form was submitted).
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                frame.getContentPane().remove(panel1);
                frame.getContentPane().add(generateWaitForGamePanel());
                frame.invalidate();
                frame.validate();
        }
        });

}
};

このコードはテストしていませんが、うまくいくはずです。