【问题标题】:Overlapping in JDialog w/ GridBagLayout when setting gridwidth设置网格宽度时在 JDialog 中与 GridBagLayout 重叠
【发布时间】:2015-01-31 06:15:59
【问题描述】:

我正在尝试创建一个如下所示的 JDialog:

但是 JTextField 跨越两列,因此它几乎到达“查找下一个”按钮。但是,当我尝试将 JTextField 的 gridwidth 设置为 2 时,我得到了这个:

这是我的代码:

JDialog dialog = new JDialog(frame, "Find");
dialog.setPreferredSize(new Dimension(370, 129));
Point p = frame.getLocation();
dialog.setLocation(p.x + 53, p.y + 170);

Container c = dialog.getContentPane();
GridBagLayout gbl = new GridBagLayout();
c.setLayout(gbl);
GridBagConstraints gbc = new GridBagConstraints();

JLabel label = new JLabel("Find what:");
gbc.gridx = gbc.gridy = 0;
c.add(label, gbc);

JTextField field = new JTextField();
field.setMinimumSize(field.getPreferredSize());
gbc.gridx = 1;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridwidth = 2;
c.add(field, gbc);

JButton findNext = new JButton("Find Next");
findNext.setPreferredSize(new Dimension(82, 23));
gbc.gridx = 3;
c.add(findNext, gbc);

JCheckBox check = new JCheckBox("Match case");
gbc.gridx = 0;
gbc.gridy = 1;
c.add(check, gbc);

JRadioButton up = new JRadioButton("Up"), down = new JRadioButton("Down");
ButtonGroup group = new ButtonGroup();
group.add(up);
group.add(down);
gbc.gridx = 1;
c.add(up, gbc);
gbc.gridx = 2;
c.add(down, gbc);

JButton cancel = new JButton("Cancel");
cancel.setPreferredSize(new Dimension(82, 23));
cancel.addActionListener(e2 -> dialog.dispose());
gbc.gridx = 3;
c.add(cancel, gbc);

Font f = new Font("Segoe UI", Font.PLAIN, 12);
c.setFont(f);
for (Component child : c.getComponents())
    child.setFont(f);

dialog.pack();
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
dialog.setResizable(false);
dialog.setVisible(true);

提前致谢!

【问题讨论】:

  • 这个dialog.setPreferredSize(new Dimension(370, 129)); 是个坏主意,它与您的特定问题直接相关,但作为旁注,所有setPreferredSize 调用都是一个问题。相反,摆脱它们,让布局管理器结合 pack 来完成它的工作

标签: java jtextfield gridbaglayout


【解决方案1】:

所以有两个问题...

  1. 您将gridwidth 设置为2,但从未重置它:gbc.gridwidth = 2;,这意味着GridBagConstraints 的所有后续使用都有gridwidth2
  2. 过度使用setPreferredSize,其实任何使用都是过度使用……

解决方案...

在重新使用 GridBagConstraints 之前先休息一下 gridwidth...

gbc.gridwidth = 2;
c.add(field, gbc);

gbc.gridwidth = 1;
//...

不要使用setPreferredSize,您无法控制可以跨多个平台更改组件所需大小的属性。

更多讨论请见Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?

setPreferredSize:

没有setPrefferedSize

你能看出按钮之间的区别吗?

如果您想在组件中添加填充,请使用 EmptyBorder 和/或 GridBagConstraints#insets 作为初学者

【讨论】:

  • 谢谢!我不敢相信我忘了重置网格宽度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-16
  • 2012-11-27
  • 2015-03-30
相关资源
最近更新 更多