在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();
我一直在谷歌上搜索,但似乎无法让它发挥作用。
答案 0 :(得分:3)
有时,当您没有看到按钮时,它就是布局管理器问题(因为您没有为布局管理器设置正确的属性)。您可以通过禁用它来测试它:
this.jPanel2.setLayoutManager(null);
设置按钮的边界(JButton.setBounds()
)。
如果以上解决了您的问题,那么您需要查看您正在使用的LayoutManager设置的要求(另请参阅Robin的回答)。
执行此操作不需要拨打validate()
,revalidate()
和repaint()
的所有电话。
答案 1 :(得分:3)
通常add
电话就足够了。
注意:BorderLayout
每个位置只能包含一个组件。因此,如果您在NORTH
位置添加其他组件,则您的按钮将不可见。
第二个注释:默认情况下,JPanel
没有BorderLayout
,而是FlowLayout
。您是否在该特定面板上设置了BorderLayout
?否则BorderLayout#NORTH
约束不正确
可以移除所有validate
,revalidate
,repaint
来电
修改强>
毕竟似乎需要进行某种验证。我认为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