Перекрытие в JDialog с GridBagLayout при настройке ширины сетки

Я пытаюсь создать JDialog, который выглядит так:

но где JTextField охватывает два столбца, так что он почти достигает кнопки "Найти далее". Однако, когда я пытаюсь установить ширину сетки 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);

Заранее спасибо!

1 ответ

Решение

Итак, две проблемы...

  1. Вы устанавливаете gridwidth в 2, но никогда не сбрасывайте его: gbc.gridwidth = 2;это означает, что все последующие использования GridBagConstraints имеет gridwidth из 2
  2. Чрезмерное использование setPreferredSizeНа самом деле, любое использование чрезмерно...

Решение...

Отдых gridwidth перед повторным использованием GridBagConstraints...

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

gbc.gridwidth = 1;
//...

Не использовать setPreferredSizeВы не управляете свойствами, которые могут изменить требуемый размер для компонентов на нескольких платформах.

См. Следует ли мне избегать использования методов set(Preferred|Maximum|Minimum)Size в Java Swing? для дальнейшего обсуждения

С setPreferredSize:

Без setPrefferedSize:

Вы видите разницу между кнопками?

Если вы хотите добавить заполнение в компонент, используйте EmptyBorder и / или GridBagConstraints#insets для начинающих

Другие вопросы по тегам