设置网格宽度时在带有 GridBagLayout 的 JDialog 中重叠
Overlapping in JDialog w/ GridBagLayout when setting gridwidth
我正在尝试创建一个如下所示的 JDialog:
但 JTextField 横跨两列,几乎到达 "Find Next" 按钮。但是,当我尝试将 JTextField 的网格宽度设置为 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);
提前致谢!
所以有两个问题...
- 您将
gridwidth
设置为 2
,但从未重置它:gbc.gridwidth = 2;
,这意味着 GridBagConstraints
的所有后续使用都有一个 gridwidth
共 2
- 过度使用
setPreferredSize
,事实上,任何使用都是过度使用...
解决方案...
在 re-using 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
and/or GridBagConstraints#insets
作为初学者
我正在尝试创建一个如下所示的 JDialog:
但 JTextField 横跨两列,几乎到达 "Find Next" 按钮。但是,当我尝试将 JTextField 的网格宽度设置为 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);
提前致谢!
所以有两个问题...
- 您将
gridwidth
设置为2
,但从未重置它:gbc.gridwidth = 2;
,这意味着GridBagConstraints
的所有后续使用都有一个gridwidth
共2
- 过度使用
setPreferredSize
,事实上,任何使用都是过度使用...
解决方案...
在 re-using 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
and/or GridBagConstraints#insets
作为初学者