В своей программе я решила расставить элементы GUI с помощью диспетчера компоновки GridBagLayout . Это самый универсальный менеджер компоновки. Он расставляет элементы по табличному принципу, но каждая ячейка может иметь любой размер, ширину, высоту и т.д.
Метод расстановки элементов этого менеджера можно представить так:
В ходе работы с этим менеджером компоновки у меня возник вопрос, как сделать пробел между элементами.На данный момент, я могу предложить несколько вариантов решения этой задачи.
Начну с того, что по умолчанию элемент, размещаемый на панели, имеет ширину и высоту в 1 ячейку.
Элемент JTextField с картинки выше может быть определен так:
JTextField textField = new JTextField(); constraints.gridwidth = 2;
- constraints.gridwidth - отвечает за количество занимаемых ячеек по горизонтали;
- constraints.gridheight - соответственно, за количество занимаемых ячеек по вертикали;
- constraints.gridx и constraints.gridy - отвечают за место по оси X или Y, которое занимает объект.
Сделать пробел между элементами в одной строке
Для реализации пробелов, первым делом мне пришла в голову идея, что можно просто задать у первого элемента gridx = 0, а у другого gridx = 2 (пропустив 1-ый). Но это будет работать только в том случае, если эта строка не первая и до нее уже были размещены объекты, суммарная или личная ширина которых составила 3 и более. Примерно так:
В других случаях, сделать пробел между элементами в одной строке можно с помощью Box.createHorizontalStrut (50) , который создает невидимый элемент заданного размера.
JButton button = new JButton("Старт"); constraints.gridx = 0; gblWidgetPanel.setConstraints(button, constraints); widgetPanel.add(button); constraints.gridx = 1; widgetPanel.add(Box.createHorizontalStrut(50),constraints); button = new JButton("Стоп"); constraints.gridx = 2; gblWidgetPanel.setConstraints(button, constraints); widgetPanel.add(button);
Используя Box. createVerticalStrut(int) подобным образом можно создать пробел и между строками элементов .
Следующий способ: использование constraints.weighty и constaints.weightx.
Если результирующая компоновка всех элементов по вертикали или горизонтали меньше области, которую они должны заполнить, тогда все свободное пространство распределяется между элементами строк или столбцов в соответствии с их весом. Как раз таки вес задается в constraints.weighty и constaints.weightx. Он задается в соотношениях от 100%. (например: 0.5 = 50%). Если установить ноль, данный элемент не получит дополнительного пространства. По умолчанию, значения всех ячеек таблицы равны нулю. То есть между верхним и нижним краем таблицы останется неиспользованное пространство.
Пример:
JLabel label = new JLabel("Нео, какую таблетку выбираешь ?"); constraints.gridwidth = 1; // сколько ячеек занимает объект constraints.gridy = 0; // какая по счету ячейка по вертикали constraints.weighty = 0.5; // 50% свободного пространства gblWidgetPanel.setConstraints(label, constraints); widgetPanel.add(label); JButton button = new JButton("Красную"); constraints.gridy = 1; constraints.weighty = 0.25; // 25% свободного пространства gblWidgetPanel.setConstraints(button, constraints); widgetPanel.add(button); JButton button = new JButton("Синюю"); constraints.gridy = 2; constraints.weighty = 0.25; // 25% свободного пространства gblWidgetPanel.setConstraints(button, constraints); widgetPanel.add(button);
Ну и последний способ на сегодня: использование EmptyBorder
Позволяет пользователю создать пустую прозрачную границу у элементов GUI.
public EmptyBorder(int top, int left, int bottom, int right)
label = new JLabel("Три"); constraints.gridy = 0; // какая по счету ячейка по вертикали label.setBorder(BorderFactory.createEmptyBorder(10, 90, 0, 0)); gblWidgetPanel.setConstraints(label, constraints); widgetPanel.add(label); label = new JLabel("Два"); constraints.gridy = 1; // какая по счету ячейка по вертикали label.setBorder(BorderFactory.createEmptyBorder(10, 60, 0, 0)); gblWidgetPanel.setConstraints(label, constraints); widgetPanel.add(label); label = new JLabel("Один"); constraints.gridy = 2; // какая по счету ячейка по вертикали constraints.gridx = 0; label.setBorder(BorderFactory.createEmptyBorder(10, 30, 10, 0)); gblWidgetPanel.setConstraints(label, constraints); widgetPanel.add(label); label = new JLabel("Поднимемся по ступенькам карьерной лестницы ?"); label.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); constraints.gridy = 3; // какая по счету ячейка по вертикали gblWidgetPanel.setConstraints(label, constraints); widgetPanel.add(label);
Итог
В статье были представлены 3 способа сделать пробелы между элементами, используя мастер компоновки GridBagLayout:
Box. createHorizontalStrut (int) и Box. createVerticalStrut(int)
constraints.weighty и constaints.weightx
EmptyBorder
Каждый из них удобен в определенной ситуации. Какой выбрать, решать вам. Возможно, есть и другие способы, не рассмотренные в данной статье.