在 BorderLayout 中交换中心 JPanel

Posted

技术标签:

【中文标题】在 BorderLayout 中交换中心 JPanel【英文标题】:Swapping out the center JPanel in a BorderLayout 【发布时间】:2011-02-12 06:10:38 【问题描述】:

我有一个 JPanel 位于 JFrame 的 BorderLayout 的中心位置。如何将当前的 JPanel 换成新的?

【问题讨论】:

【参考方案1】:

你有没有尝试过:

void swapCenterPanel(JFrame frame, JPanel oldPanel, JPanel newPanel) 
    frame.getContentPane().remove(oldPanel);
    frame.getContentPane().add(newPanel, BorderLayout.CENTER); 

【讨论】:

您还需要在此建议中添加 revalidate() 或 validate()。【参考方案2】:

使用Card Layout 为您管理。

【讨论】:

【参考方案3】:

只需将组件添加到中心并 revalidate() 父容器

container.add(BorderLayout.CENTER, newPanel);
container.revalidate();

【讨论】:

顺便说一句,container.revalidate() 实际上应该是 container.validate()。 -1,此解决方案不起作用。它似乎工作,但尝试调整框架的大小,以前的面板现在将被绘制在新面板的顶部。这是因为“Z-Ordering”在 Swing 中的工作方式。正确的解决方案是给出的另外两个建议之一,具体取决于您的确切要求。 建议您尝试一下 :) BorderLayout 只能在其中心有一个组件,并在您添加某些内容时替换已经存在的任何内容。【参考方案4】:

通过反复试验,我得到了这个没有 z 索引问题的工作。

让 x 调用具有 BorderLayout 的 JPanel 让我们称你为当前占用BorderLayout.CenterComponent 让我们调用 z JPanel 来替换中心位置。

   x.remove(y);
   x.add(z);
   x.repaint();
   x.revalidate();

我发现如果我尝试通过 LayoutManager 本身删除现有的 JPanel,它不起作用。相反,如果您使用 JPanel 的 remove 方法,java 文档会说它会通知布局 removeLayoutComponent 方法并且似乎可以解决问题。

【讨论】:

以上是关于在 BorderLayout 中交换中心 JPanel的主要内容,如果未能解决你的问题,请参考以下文章

java中怎样画出3行3列的、可以填充字符的表格?

10.4 使用布局管理器2(BorderLayout)

BorderLayout.CENTER 上 GridBagLayout 面板的垂直对齐

在中心的任一侧对齐 2 套/项目

玩转华为数据中心交换机系列 | 配置STP功能示例

互联网交换中心