在 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.Center
的Component
让我们调用 z JPanel
来替换中心位置。
x.remove(y);
x.add(z);
x.repaint();
x.revalidate();
我发现如果我尝试通过 LayoutManager 本身删除现有的 JPanel,它不起作用。相反,如果您使用 JPanel 的 remove 方法,java 文档会说它会通知布局 removeLayoutComponent 方法并且似乎可以解决问题。
【讨论】:
以上是关于在 BorderLayout 中交换中心 JPanel的主要内容,如果未能解决你的问题,请参考以下文章