Рина Сергеева
Рина Сергеева9 мая 2018 г. 2: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

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

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:50баллов,
  • Очки рейтинга-4
m
  • molni99
  • 26 октября 2024 г. 1:37

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80баллов,
  • Очки рейтинга4
m
  • molni99
  • 26 октября 2024 г. 1:29

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:20баллов,
  • Очки рейтинга-10
Последние комментарии
i
innorwall14 ноября 2024 г. 21:26
Qt/C++ - Урок 031. QCustomPlot - строим график по времени buy generic priligy We can just chat, and we will not lose too much time anyway
i
innorwall14 ноября 2024 г. 19:03
Qt/C++ - Урок 060. Настройка внешнего вида приложения в рантайме I didnt have an issue work colors priligy dapoxetine 60mg revia cost uk August 3, 2022 Reply
i
innorwall14 ноября 2024 г. 11:42
Как Копировать Файлы в Linux If only females relatives with DZ offspring were considered these percentages were 23 order priligy online uk
i
innorwall14 ноября 2024 г. 9:09
Qt/C++ - Урок 068. Hello World с использованием системы сборки CMAKE в CLion ditropan pristiq dosing With the Yankees leading, 4 3, Rivera jogged in from the bullpen to a standing ovation as he prepared for his final appearance in Chicago buy priligy pakistan
Сейчас обсуждают на форуме
i
innorwall14 ноября 2024 г. 3:39
добавить qlineseries в функции priligy amazon canada 93 GREB1 protein GREB1 AB011147 6
i
innorwall11 ноября 2024 г. 10:55
Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
9
9Anonim25 октября 2024 г. 9:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
ИМ
Игорь Максимов3 октября 2024 г. 4:05
Реализация навигации по разделам Спасибо Евгений!

Следите за нами в социальных сетях