2010-03-21 113 views
2

我想从窗口(JFrame)中删除旧的JPanel并添加一个新的JPanel。我应该怎么做?如何删除旧的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无形的,但它不工作。编译器抱怨用<------------表示的行。它写道:<identifier> 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并使其可见之后,我向JFrame添加了一个新的JPanel。

我应该这样做吗?

回答

4

调用setVisible(假),即使是在正确的地方,实际上不会从容器中取出的面板。如果你想更换面板这样做:

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

注意frame.getContentPane()加(组件)是一样的frame.add(组件) - 组件实际上所包含的内容窗格中。

+0

拉斯海沃德,是否可以将捞出的JFrame后添加JPanels已经打包,并设置明显的?我应该在事件派发线程中添加和删除JPanel吗? – Roman 2010-03-21 16:26:25

+0

我通过'frame.getContentPane()。remove(partnerSelectionPanel);'替换了'partnerSelectionPanel.setVisible(false);'后,我的程序停止移除旧的帧(即使我最后使用'invalidate' )。 – Roman 2010-03-21 16:31:36

+0

是在EDT上添加,删除和创建组件。我错过了一个验证电话 - 我从来没有记得那些!如果添加无效和验证,应该可以工作。 – 2010-03-21 16:42:14

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

这条线是actualy所述方法运行。

你可能想是这样的:

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

不要忘记或忽视使用布局的方法,即CardLayout作为框架布局,以允许这种类型的行为(例如,这是一个很好的策略)。这样做的一个好处是它不会引起任何奇怪的闪光或绘制效果,因为这是布局所要做的 - 允许面板被换出,假设它们具有排他性的“房地产”或可以共享相同的区域(即“精灵”般的行为。)

0

您可以使用

Frame.setContentPane(jPanel);