如何从JFrame中删除JPanel?

Rom*_*man 9 java user-interface swing multithreading

最近我在这里问到如何将新的JPanel添加到JFrame.答案帮助我获得了一个有效的代码.但不是我有一个相关的问题:"我怎样才能删除旧的JPanel".因为以下问题我需要它.

当我想要时出现一个新的JPanel(超出时间限制或用户按下"提交"按钮).但是在几秒钟内,旧JPanel的一些元素与新JPanel的组件一起出现.我不明白为什么会这样.

我认为这是因为我必须更新窗口的其他线程.但是第一个线程只添加一次旧面板(因此,它应该完成).在第二个线程中,我有一个被破坏的循环(因此,它也应该完成).

这是我的代码:

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

    }
};
Run Code Online (Sandbox Code Playgroud)

cam*_*ckr 8

无论是在可见GUI上添加还是删除组件,都是一样的:

panel.remove(...);
panel.add(...);
panel.revalidate();
panel.repaint();
Run Code Online (Sandbox Code Playgroud)


pst*_*ton 7

从容器(框架)中删除组件(面板)的最简单方法是保持对它的引用,然后调用Container.remove(Component)ie:

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

}
};
Run Code Online (Sandbox Code Playgroud)

我没有测试过这段代码,但它应该可行.