#java #swing #layout-manager
#java #swing #layout-manager
Вопрос:
У меня есть проект по копированию графического интерфейса входа в Google здесь . Пока я все еще ищу, с чего начать, но после некоторых исследований я думаю, что в BorderLayout это возможно сделать. Я понимаю, как это работает, перенастраивая все через границы, и мне это вроде как нравится, потому что это довольно отзывчиво по сравнению с нулевым макетом и кодированием всех установленных границ для каждого компонента.
Я представлял, как использую фоновую панель, панель для формы заполнения и создаю панели для каждой пары меток и текстовых полей, чтобы правильно создать пространство и наложить (или вложить) их друг на друга. Наша учительница только что сказала нам вырезать изображение, она просто хочет знать, знаем ли мы, как создать что-то с нуля. Это, а также сохранение входных данных в текстовый файл.
Однако, похоже, я не могу понять концепцию увеличения размера компонента внутри границ, чтобы имитировать пробелы между текстовыми полями, например, какое-то заполнение между компонентами? Использование setSize не работает, и пока мой поиск приводит только к изменению размера границ, или, возможно, я все еще не ввел для этого правильный поисковый термин?
Кроме того, я искал другой способ, и я думаю, что этот проект также будет работать с использованием GridBagLayout. Однако многие люди говорят, что GridBagLayout слишком сложен. Как вы думаете, что было бы проще?
Комментарии:
1. Просто основано на мнении, но я предпочитаю
GridBagLayout
. Используйте егоInsets
для управления пробелами.2. Хм, я вижу, что вставки сделаны для одного объекта. Итак, если один компонент не должен соответствовать уже объявленному, означает ли это, что мне нужно будет создать другой? Например, кнопка «Следующий шаг», похоже, расположена дальше, чем другие отступы. Это означает, что этот новый вставленный объект должен адаптироваться к изменениям другого, или в API есть такая вещь, которая обрабатывает эту ситуацию?
3. @inNeedOfHelp В качестве дополнительного примечания: проверьте docs.oracle.com/javase/tutorial/uiswing/layout/visual.html чтобы получить базовую визуализацию другого базового менеджера компоновки. Также имейте в виду, что вы можете размещать панели внутри других панелей, и у каждой панели есть менеджер компоновки, который может отличаться от других панелей.
Ответ №1:
По моему опыту, почти все (99%) используемые панели GridBagLayout
могут быть спроектированы с использованием всех других макетов. Итак, кто-то мог бы сказать, что GridBagLayout
это необязательно
В вашей ситуации легко избежать использования GridBagLayout
. Взгляните на следующий код:
public class NoGridBagLayout extends JFrame {
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new NoGridBagLayout().setVisible(true));
}
public NoGridBagLayout() {
super();
setDefaultCloseOperation(EXIT_ON_CLOSE);
setExtendedState(MAXIMIZED_BOTH);
JPanel borderPanel = new JPanel(new BorderLayout());
borderPanel.setBorder(new TitledBorder("borderPanel - BorderLayout"));
JLabel label = new JLabel("Create a google account.");
label.setHorizontalAlignment(JLabel.CENTER);
label.setFont(label.getFont().deriveFont(25f));
borderPanel.add(label, BorderLayout.PAGE_START);
setContentPane(borderPanel);
JPanel gridPanel = new JPanel(new GridLayout(1, 2));
gridPanel.setBorder(new TitledBorder("gridPanel - GridLayout"));
getContentPane().add(gridPanel, BorderLayout.CENTER);
JPanel leftBoxedPanel = new JPanel(); // Fill it with panels using BoxLayout.X_AXIS
leftBoxedPanel.setLayout(new BoxLayout(leftBoxedPanel, BoxLayout.Y_AXIS));
leftBoxedPanel.setBorder(new TitledBorder("leftBoxedPanel - BoxLayout.Y_AXIS"));
gridPanel.add(leftBoxedPanel);
JPanel rightBoxedPanel = new JPanel(); // Fill it with panels using BoxLayout.X_AXIS
rightBoxedPanel.setLayout(new BoxLayout(rightBoxedPanel, BoxLayout.Y_AXIS));
rightBoxedPanel.setBorder(new TitledBorder("rightBoxedPanel - BoxLayout.Y_AXIS"));
gridPanel.add(rightBoxedPanel);
}
}
Предварительный просмотр:
Комментарии:
1. Вау, это чистый вариант! Я думаю, что я решил переключиться на GridBagLayout, чтобы создать саму форму, и создать BorderLayouts для внешнего размещения.