gpt4 book ai didi

java - 为什么 JButton 不显示,除非在 JButton 添加到 JPanel 后设置文本?

转载 作者:行者123 更新时间:2023-11-29 05:13:53 25 4
gpt4 key购买 nike

我的 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。

Why does a JButton not show unless text is set after JButton is added to JPanel?

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

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

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

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

关于java - 为什么 JButton 不显示,除非在 JButton 添加到 JPanel 后设置文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27285233/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com