我的JButton对象的行为方式很奇怪:

JFrame frame = new JFrame();
frame.setSize(new Dimension(200, 200));
frame.setVisible(true);

//Constraints
GridBagConstraints constraints = new GridBagConstraints();
constraints.weightx = 1.0;
constraints.weighty = 1.0;
...
//

JPanel panel = new JPanel();
panel.setLayout(new GridBagLayout());
JButton button = new JButton("Categories:");
panel.add(button, constraints);
frame.add(panel);


这将产生以下GUI:



按钮在哪里?

当我用以下内容替换最后几行时:

JPanel panel = new JPanel();
JButton button = new JButton();
panel.add(button, constraints);
button.setText("Categories:");

frame.add(panel);


我得到以下GUI:



现在将显示该按钮。

为什么是这样?我认为在按钮的构造函数中提供一个字符串将导致与显式调用setter相同。

最佳答案

正如人们指出的那样,在pack()框架并使框架可见之前,应将组件添加到GUI。


  除非在将JButton添加到JPanel后设置了文本,否则为什么不显示JButton?


但是,要回答上述问题,即使框架可见,也可以将组件添加到GUI。在执行此操作时,必须告诉Swing已添加(或删除)了组件,以便可以调用布局管理器。您可以使用以下代码执行此操作:

panel.add(...);
panel.revalidate();
panel.repaint();


在您的情况下,当您在按钮上调用setText(...)方法时,该按钮实际上会为您调用revalidate()和repaint()。只要更改了Swing组件的属性,就可以有效地调用布局管理器,就可以完成此操作,这意味着布局管理器可以在绘制按钮之前为按钮分配大小/位置。

在您的原始代码中,将按钮添加到GUI时未调用布局管理器,因此其默认大小为(0,0);

10-07 19:04
查看更多