如何在Java中动态地在其他面板上添加面板?

11

我正尝试重新学习Java(已有几年没有碰过了)。我以前从未真正进行过Java的GUI编程。我一直在使用Netbeans开始这项工作。

在工作中使用C#的WinForms时,我会使用用户控件来构建我的UI的部分,并动态地将它们添加到表单中。

我一直在尝试使用 JPanel 来替代C#中的用户控件。我创建了一个名为 BlurbEditorJPanel 表单。这个表单上有几个简单的控件。我试图在按钮事件中运行时将其添加到另一个面板中。

下面是我认为会起作用的代码:

mainPanel.add(new BlurbEditor());
mainPanel.revalidate();
//I've also tried all possible combinations of these too
//mainPanel.repaint();
//mainPanel.validate();

很遗憾,这不起作用。我做错了什么?

6个回答

17

我搞清楚了。这里接受的答案下面的评论解释了一切:Dynamically added JTable not displaying

基本上,在 mainPanel.add() 之前我只是添加了以下内容:

mainPanel.setLayout(new java.awt.BorderLayout());

5
Swing/AWT组件通常需要在添加内容之前设置布局 - 否则UI不知道如何放置子组件。
BFreeman建议使用BorderLayout,这是最容易使用的布局之一,允许您将内容“粘贴”到父级的顶部、底部、左侧、右侧或中心。
还有其他布局,例如FlowLayout,它类似于textarea - 它从父级顶部从左到右添加组件,并在到达末尾时换行到新行。 GridBagLayout一直以来被认为是难以理解的,但确实可以给您几乎所有需要的控制。有点像我们曾经看到的带有奇怪的rowspan、colspan、width和height属性的HTML表格 - 它们似乎永远不会完全符合您的要求。

1
我遇到了类似的问题,我想在运行时更改包含在面板中的面板。 经过一些测试、重复测试和很多失败后,我的伪算法是这样的: parentPanel: 包含我们想要移除的面板 childPanel: 我们想要切换的面板 parentPanelLayout: parentPanel的布局 editParentLayout(): 每次使用不同的childPanel和NEW parentPanelLayout构建parentPanel
parentPanel.remove(childPanel); 
editParentLayout();
parentPanel.revalidate();
parentPanel.repaint();

0

mainPanel.add(new BlurbEditor());

主面板添加新的Blurb编辑器。

mainPanel.validate();

mainPanel.repaint();


0
与所有Swing代码一样,不要忘记在事件分派线程中调用任何GUI更新。请参见this了解为什么必须像这样更新。
// Do long running calculations and other stuff outside the event dispatch thread
while (! finished )
  calculate();
SwingUtilities.invokeLater(new Runnable(){
  public void run() {
    // update gui here
  }
}

-1
尝试使用 mainPanel.invalidate(),然后如果有必要,使用 mainPanel.validate()。另外,值得注意的是,确保在事件分派线程中执行所有操作,否则你的结果将不稳定并且(通常)不确定。

添加invalidate方法调用没有帮助。我是从NetBeans生成的mouseclick事件中调用它的。 - BFreeman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接