Спустя почти 4 года в программировании на Java я решил научиться писать классы GUI самостоятельно, так как до сих пор я всегда использовал редактор графического редактора NetBeans (я не особенно этому горжусь, но он работал довольно хорошо, избегая меня беспокоиться о компоновке компонентов).GroupLayout сгенерированный код в NetBeans
Дело в том, что я следую How to Use GroupLayout учебным пособиям, чтобы узнать об этом менеджере макетов, который я нахожу очень мощным. Теперь я сделал небольшой пример по своему усмотрению, а затем попытаюсь сделать то же самое в редакторе графических сред Netbeans, и обнаружил некоторые различия между обоими кодами, и я хотел бы знать, что я что-то упустил, или NetBeans просто добавляет бесполезный код в определение GroupLayout ,
Это моя цель:
Это мой SSCCE:
public static void main(String[] args) {
JLabel label = new JLabel("This is a test");
label.setFont(new Font("Segoe UI Semibold", Font.BOLD | Font.ITALIC, 24));
JSeparator separator = new JSeparator(JSeparator.HORIZONTAL);
DefaultListModel model = new DefaultListModel();
model.addElement("Apple");
model.addElement("Orange");
model.addElement("Kiwi");
model.addElement("Watermelon");
JList list = new JList(model);
list.setPreferredSize(new Dimension(400, 300));
JScrollPane scrollPane = new JScrollPane();
scrollPane.setViewportView(list);
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
Container contentPane = frame.getContentPane();
GroupLayout layout = new GroupLayout(contentPane);
layout.setAutoCreateContainerGaps(true);
contentPane.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(label, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE, Short.MAX_VALUE)
.addComponent(separator)
.addComponent(scrollPane)
);
layout.setVerticalGroup(
layout.createSequentialGroup()
.addComponent(label)
.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
.addComponent(separator, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE, Short.MAX_VALUE)
.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
.addComponent(scrollPane, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE, Short.MAX_VALUE)
);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
Как вы можете видеть, что я только определил paralell группу в качестве горизонтальной группы и последовательной группы как по вертикали группа. Но Netbeans автогенерирует этот код:
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(label, javax.swing.GroupLayout.DEFAULT_SIZE, 300, Short.MAX_VALUE)
.addComponent(separator)
.addComponent(scrollPane))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(label)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(separator, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(scrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 224, Short.MAX_VALUE)
.addContainerGap())
);
Как вы можете видеть, структура группы немного сложнее, чем моя. Я просто хочу знать, ошибаюсь ли я, или Netbeans просто излишне добавляет больше групп, чем нужно.
Просто комментарий: GroupLayout предназначен для использования с строителем, поэтому его трудно использовать с ручным кодированием. Мое предложение состояло в том, чтобы использовать LayoutManager, который предназначен для удобства использования в ручном коде, один из Big Three: MigLayout, FormLayout, DesignGridBagLayout. – kleopatra
+1 для sscce; обратите внимание, что они имеют разные изменения размера. – trashgod
Спасибо за комментарии! Я посмотрю на других менеджеров компоновки, потому что, да, это трудно использовать с помощью ручной кодировки. @trashgod, вы правы в изменении поведения. Раньше я этого не замечал. В частности, мне не нравится очень сильно изменять размеры, если это не будет строго необходимо f.e. большие столы или что-то, что может потребовать много места. Это только мои предпочтения. – dic19