如何在Java中在运行时动态地将Panel添加到其他面板?

时间:2008-10-04 05:32:06

标签: java swing

我想再次进入java(已经有几年了)。我从来没有真正在java中进行任何GUI编码。我一直在使用Netbeans来开始这个。

在工作中使用C#中的winforms时,我使用usercontrols来构建UI的一部分并动态地将它们添加到表单中。

我一直在尝试在C#中使用类似用户控件的JPanels。我创建了一个名为JPanel的{​​{1}}表单。这有一些简单的控制。我试图在运行时将其添加到另一个面板上的按钮事件。

以下是我认为可行的代码:

BlurbEditor

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

6 个答案:

答案 0 :(得分:17)

我明白了。在此接受的答案下的评论解释了它: Dynamically added JTable not displaying

基本上我只是在mainPanel.add()

之前添加了以下内容
mainPanel.setLayout(new java.awt.BorderLayout());

答案 1 :(得分:5)

Swing/AWT组件在向其添加内容之前通常必须具有布局 - 否则UI将无法知道子组件的放置位置。

BFreeman建议使用BorderLayout这是最容易使用的内容之一,并允许您将内容“胶合”到父母的顶部,底部,左侧,右侧或中心。

还有其他像FlowLayout这样的textarea - 它在父级的顶部从左到右添加组件,并在到达结尾时包装到新的行。

GridBagLayout一直因为无法弄清楚而臭名昭着,但确实能给你几乎所有你需要的控制权。有点像我们过去看到的那些HTML表格,其中包括rowspan,colspan,width和height属性的奇怪组合 - 这些表格看起来似乎并不像你想要的那样。

答案 2 :(得分: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
  }
}

答案 3 :(得分:0)

mainPanel.add(new BlurbEditor());

mainPanel.validate();

mainPanel.repaint();

答案 4 :(得分:0)

我正在处理类似的问题,我想在运行时更改面板中包含的面板 经过一些测试,重新测试和很多失败的伪算法是这样的:

parentPanel:包含我们要删除的面板
childPanel:我们要切换的面板
parentPanelLayout:parentPanel的布局
editParentLayout():每次使用不同的childPanel和NEW parentPanelLayout构建parentPanel

parentPanel.remove(childPanel); 
editParentLayout();
parentPanel.revalidate();
parentPanel.repaint();

答案 5 :(得分:-1)

尝试mainPanel.invalidate(),然后根据需要mainPanel.validate()。也可能值得检查一下你在事件发送线程中是否正在执行此操作,否则您的结果将是不稳定的并且(通常)是非确定性的。