如何删除旧的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); } };
它有效,但由于以下原因,它不像我看起来像一个安全的解决方案:
- 我从另一个线程更改并添加元素到JFrame。
- 在我已经“打包”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);