【问题标题】:How to empty this panel and add new panels如何清空此面板并添加新面板
【发布时间】:2020-04-05 18:09:27
【问题描述】:

我有一个主要的JPanel 容器和三个 JPanel。如何清空此面板并添加新面板?我尝试使用remove(Component),但它不起作用。有人可以给我建议吗?

【问题讨论】:

  • 在您的 JPanel 中移除组件后,您是否验证和/或重新绘制?
  • 另请注意,某些LayoutManagers 不允许您从他们管理的面板中删除组件。

标签: java swing


【解决方案1】:

这样就可以了。诀窍是调用 revalidate。

mainPanel = ...

mainPanel.removeAll();
mainPanel.add(newPanel1);
mainPanel.add(newPanel2);
mainPanel.add(newPanel3);
mainPanel.revalidate();  

但实际上,如果您想更改 JPanel 中显示的内容,请考虑使用 CardLayout。

【讨论】:

  • 除了 revalidate() 之外,您可能还需要在容器上调用 pack()JDialogJFrame)以获得正确的大小。
【解决方案2】:

link 中,我找到了一个关于如何在面板中添加和删除元素的简单教程。 主面板中的其他面板也是元素,因此同样的原则适用于它们。

在面板中添加新内容时的一个好习惯不仅仅是使用方法 add(): 我们可能还想使用 revalidate()repaint() 它们应该在某些事件发生时调用(单击按钮或类似...)

我还想提一下,在教程 remove() 中我被用来删除元素,你这样做是正确的。可能为其他面板再次调用 revalidate()repaint() 会使删除的面板从 GUI 中消失(对象被删除,只是 GUI 没有刷新)

注意:我想你的内部面板的元素是可见的 = true。如果某些内部元素难以渲染,请尝试对它们调用 revalidate()repaint()。 我认为这种方式应该可行。

【讨论】:

    【解决方案3】:

    @哈里·乔伊

    如果您添加或删除(已经可见的容器),那么您必须调用

    revalidate(); repaint(); // not required in all cases

    @达米尔 如果 JComponents 不是公共(或私有)静态的,那么您可以调用

    myContainer.removeAll();
    myContainer.revalidate();
    nyCOntainer.repaint();
    

    可能是通过Component[] a = myContainer.getComponents(); 的某些参数删除JComponent(s) 然后您可以调用if (components[i] instanceof JComboBox) { ...

    【讨论】:

      【解决方案4】:

      尝试其他删除方法remove(int index);

      【讨论】:

        【解决方案5】:

        这 100% 有效

        this.panelname.Controls.Clear();
        

        【讨论】:

          【解决方案6】:

          我也有同样的问题。我为解决这个问题所做的只是

          panelName.setVisible(false);
          mainPanel.remove(panelName);
          

          在我的例子中,panelName 是一个位于 mainPanel 内的 JPanel。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-01-16
            • 2012-01-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多