Рина Сергеева
Мамыр 9, 2018, 12:49 Т.Қ.

GridBagLayout орналасу менеджерінде толтыруды қалай жасауға болады

В своей программе я решила расставить элементы 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

Каждый из них удобен в определенной ситуации. Какой выбрать, решать вам. Возможно, есть и другие способы, не рассмотренные в данной статье.

Мақала бойынша сұралады0сұрақтар(лар)

2

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз