如何删除旧的JPanel并添加新的JPanel?

我想从Window(JFrame)中删除旧的JPanel并添加一个新的JPanel。 我该怎么办?

我尝试了以下方法:

public static void showGUI() { JFrame frame = new JFrame("Colored Trails"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(partnerSelectionPanel); frame.setSize(600,400); frame.setVisible(true); } private static void updateGUI(final int i, final JLabel label, final JPanel partnerSelectionPanel) { SwingUtilities.invokeLater( new Runnable() { public void run() { label.setText(i + " seconds left."); } partnerSelectionPanel.setVisible(false); \\ <------------ } ); } 

我的代码更新了“旧”JPanel,然后它使整个JPanel不可见,但它不起作用。 编译器抱怨<------------指示的行。 它写道: expected, illegal start of type

添加:

我设法做了我需要的工作,并按以下方式完成:

 public static void showGUI() { frame = new JFrame("Colored Trails"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(partnerSelectionPanel); //frame.add(selectionFinishedPanel); frame.setSize(600,400); frame.setVisible(true); } public static Thread counter = new Thread() { public void run() { for (int i=4; i>0; i=i-1) { updateGUI(i,label); try {Thread.sleep(1000);} catch(InterruptedException e) {}; } partnerSelectionPanel.setVisible(false); frame.add(selectionFinishedPanel); } }; 

它有效,但由于以下原因,它不像我看起来像一个安全的解决方案:

  1. 我从另一个线程更改并添加元素到JFrame。
  2. 在我已经“打包”JFrame并使其可见之后,我将一个新的JPanel添加到JFrame。

我应该这样做吗?

setVisible(false),即使在正确的位置,也不会实际从容器中移除面板。 如果要更换面板,请执行以下操作:

 frame.getContentPane().remove(partnerSelectionPanel); frame.add(new JPanel()); frame.getContentPane().invalidate(); frame.getContentPane().validate(); 

请注意,frame.getContentPane()。add(Component)与frame.add(Component)相同 – 组件实际上包含在内容窗格中。

不要忘记或忽略使用布局的方法,即CardLayout作为框架布局,以允许这种类型的行为(例如,这是“向导”的好策略)。 这样做的一个优点是它不会引起任何奇怪的闪光或绘制效果,因为这就是这个布局的意图 – 允许换出面板,假设它们具有独占的“不动产”或者可以共享相同的区域(即“向导”喜欢的行为。)

 partnerSelectionPanel.setVisible(false); \\ <------------ 

这条线实际上是方法运行。

你可能想要这样的东西:

 public void run() { label.setText(i + " seconds left."); try { Thread.sleep (i * 1000); } catch (InterruptedException e) { handleException (e); } partnerSelectionPanel.setVisible(false); } 

您可以使用

  Frame.setContentPane(jPanel);