如何动态地将JButton添加到JPanel?

时间:2012-03-27 08:29:02

标签: java swing

在NetBeans中,我使用GUI编辑器制作JFrame,并在框架中放置了JPanel。 目前,我正在尝试在类构造时在面板中创建一个新按钮。 这是我的代码,但我似乎无法让它工作。 (第一行显示按钮,其他行尝试显示它。)

this.jPanel2.add(new JButton("Test"),BorderLayout.NORTH);
this.jPanel2.validate();
this.jPanel2.revalidate();
this.jPanel2.repaint();
this.jPanel2.setVisible(true);
this.revalidate();
this.setVisible(true);
this.repaint();

我一直在谷歌上搜索,但似乎无法让它发挥作用。

3 个答案:

答案 0 :(得分:3)

有时,当您没有看到按钮时,它就是布局管理器问题(因为您没有为布局管理器设置正确的属性)。您可以通过禁用它来测试它:

this.jPanel2.setLayoutManager(null);

设置按钮的边界(JButton.setBounds())。

如果以上解决了您的问题,那么您需要查看您正在使用的LayoutManager设置的要求(另请参阅Robin的回答)。

执行此操作不需要拨打validate()revalidate()repaint()的所有电话。

答案 1 :(得分:3)

通常add电话就足够了。

注意:BorderLayout每个位置只能包含一个组件。因此,如果您在NORTH位置添加其他组件,则您的按钮将不可见。

第二个注释:默认情况下,JPanel没有BorderLayout,而是FlowLayout。您是否在该特定面板上设置了BorderLayout?否则BorderLayout#NORTH约束不正确

可以移除所有validaterevalidaterepaint来电

修改

毕竟似乎需要进行某种验证。我认为Swing应该足够聪明,可以在将某些内容添加到Container时监听事件,并更新任何必要的内容(有点类似于更新TableModel更新{{1基于事件,无需在JTable上调用repaint或类似内容。

但是,在SSCCE中尝试这个时,我来到了以下代码(不同的版本,只发布最复杂的版本)

  • 没有滚动窗格,JTable调用似乎没有效果。我实际上需要再次调用validate以使新标签可见(不包含在SSCCE中,但从代码中删除滚动窗格是微不足道的)
  • 使用滚动窗格,pack调用具有效果

    validate

答案 2 :(得分:0)

使用Image和ActionListener创建动态JButton - Java Swing

使用Image和ActionListener动态创建JButton。您可以在一个位置更改按钮高度,宽度水平间隙和垂直间隙。

you can find more details from here

enter image description here