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

Posted

技术标签:

【中文标题】如何删除旧的 JPanel 并添加新的?【英文标题】:How do I remove an old JPanel and add a new one? 【发布时间】:2011-01-30 01:37:44 【问题描述】:

我想从窗口 (JFrame) 中删除一个旧的 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 不可见,但它不起作用。编译器抱怨&lt;------------ 指示的行。它写道:&lt;identifier&gt; 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 并使其可见之后,我向 JFrame 添加了一个新的 JPanel。

我应该这样做吗?

【问题讨论】:

【参考方案1】:

你可以使用

  Frame.setContentPane(jPanel);

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

Russ Hayward,在 JFrame 已经打包并设置为可见之后,是否可以删除和添加 JPanel?我应该在事件调度线程中添加和删除 JPanel 吗? 在我用frame.getContentPane().remove(partnerSelectionPanel); 替换partnerSelectionPanel.setVisible(false); 后,我的程序停止删除旧框架(即使我最后使用invalidate)。 是的,添加、删除和创建组件应该在 EDT 上进行。我错过了一个验证电话——我不记得那些了!如果您添加无效和验证应该可以工作。 请记住 Visible 访问器,这些访问器有助于使用户看到“随机播放”或大量闪烁,因为任何特定组件不仅更新,而且更新某些组件同时它们是 setVisible(false) 可以显着提高性能——实际上,这种策略的有用性甚至成功似乎因组件而异,甚至在不同版本的 JDK 之间也有所不同,也不要忘记你可以在之后重新“打包”框架你已经交换了面板。【参考方案4】:
partnerSelectionPanel.setVisible(false); \\ <------------

这一行实际上是方法运行之外的。

你可能想要这样的东西:

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

【讨论】:

以上是关于如何删除旧的 JPanel 并添加新的?的主要内容,如果未能解决你的问题,请参考以下文章

在 android studio 中删除旧的并添加新的 git

如何简单地删除旧的核心数据并重建新的?

让 JButton 打开一个新的 JPanel

linux中如何清除文件中旧的操作历史记录

Zip - 添加较新的文件和文件夹,删除旧的

如何删除 SSH 密钥?