Пытаюсь создать приложение с графическим интерфейсом на Java / Swing. В основном я привык «рисовать» графические интерфейсы на стороне Windows с помощью таких инструментов, как VB (или, точнее, Gupta SQLWindows ... интересно, сколько людей знают, что это такое ;-)).
Я не могу найти аналог Group Box в Swing ...
В групповом поле у вас есть квадратное поле (обычно с заголовком) вокруг пары связанных виджетов. Одним из примеров является групповое поле вокруг нескольких переключателей (с заголовком, объясняющим, что это за переключатели, например, групповое поле с заголовком «Пол» с переключателями «Мужской» и «Женский»).
Я немного искал ... единственный способ, который я нашел, - это добавить подпанель, установить границу на подпанели, а затем добавить все виджеты из «группы» в подпанель. Есть ли более элегантный способ сделать это?
Я думаю, он имеет в виду группу управления, которую вы видите во многих диалоговых окнах, где у вас есть квадрат вокруг группы виджетов, таких как переключатели, например.




Не AFAIK, по крайней мере, не со стандартными виджетами качелей.
В VB у вас есть виджет группы, который по сути представляет собой панель + границу.
В Swing у вас есть JPanel, который является виджетом-контейнером, и вы создаете и устанавливаете на нем объект границы, только если он вам нужен. Можно утверждать, что это более элегантно, поскольку вы не платите за то, что не используете (например, границу)
Я отвечаю на основе комментария Uri, в котором объясняется, что OP имел в виду под Group Box:
Uri: I think he means the control group you see in many dialog boxes, where you have a square around a bunch of widgets such as radio buttons, for example.
Насколько мне известно, каждый JComponent может устанавливать границы для себя, поэтому вам не нужна вторая панель.
Я хочу иметь границу вокруг нескольких JComponents ... кроме того, наличие только одного элемента в групповом поле обычно является плохой практикой.
Вы можете добавить более одного компонента в JPanel.
Я знаю .. Наверное, я неправильно понял твой ответ.
Эм-м-м? Какой комментарий? Это все еще ответ на исходный вопрос? Я этого не вижу.
Создайте JPanel и добавьте к нему свои радиокнопки. Не забудьте установить подходящий макет JPanel.
Тогда звоните panel.setBorder(BorderFactory.createTitledBorder(name));
Поле «Группа» - это просто набор «логически сгруппированных виджетов».
В мире свинга это JPanel.
Добавьте свои виджеты в JPanel.
Установите для его типа границы значение «Граница с заголовком» и дайте название, такое же, как имя «рамки» VB6.
Вуаля. У вас есть групповой ящик.
Другие уже отзывались о JPanel и использовали TitledBorder, это нормально.
Однако, играя с Swing LayoutManager, вас может раздражать то, что компоненты в разных JPanel не могут правильно выровняться (каждая панель имеет свой собственный LayoutManager).
По этой причине в графических интерфейсах Swing рекомендуется НЕ использовать TitledBorders, а разделять группы компонентов в JPanel с помощью JLabel, за которым следует горизонтальный JSeparator.
Ref. «Первая помощь при качелях»
Существуют ли руководящие принципы Oracle или системы, поддерживающие это утверждение? Этот ярлык + разделитель должен быть предпочтительнее группового бокса? JGoodies - это просто компания один, реализующая Java.
@Kissaki Я упоминал, что это хорошая практика, а не официальное руководство. Дело в том, что с системой менеджеров компоновки Swing вы НЕ МОЖЕТЕ выровнять компоненты на двух панелях. Следовательно, использование границ означает потерю выравнивания компонентов материала.
Вот цитата из javadocs JRadioButton с тех пор, как вы подняли переключатели.
An implementation of a radio button -- an item that can be selected or deselected, and which displays its state to the user. Used with a ButtonGroup object to create a group of buttons in which only one button at a time can be selected. (Create a ButtonGroup object and use its add method to include the JRadioButton objects in the group.)
Note: The ButtonGroup object is a logical grouping -- not a physical grouping. To create a button panel, you should still create a JPanel or similar container-object and add a Border to it to set it off from surrounding components.
Спасибо, но, как вы правильно заметили, моей главной целью был "визуальный" аспект.
Возможно, вы могли бы объяснить, что такое групповой ящик.