Рина Сергеева
Рина Сергеева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 г. 11:37

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

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

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

  • Результат:20баллов,
  • Очки рейтинга-10
Последние комментарии
ИМ
Игорь Максимов22 ноября 2024 г. 22:51
Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii Legotckoi1 ноября 2024 г. 0:37
Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZE19 октября 2024 г. 18:19
Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов5 октября 2024 г. 17:51
Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55 июля 2024 г. 21:02
QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Сейчас обсуждают на форуме
Evgenii Legotckoi
Evgenii Legotckoi25 июня 2024 г. 1:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey115 ноября 2024 г. 17:04
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProject4 июня 2022 г. 13:49
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9Anonim25 октября 2024 г. 19:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

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