在java编程工作了近4年之后,我决定自己学习如何自己编写GUI类,因为到目前为止我一直使用NetBeans GUI编辑器(我并不是特别自豪但是它已经很好地避免了我担心关于组件布局)。
问题是我正在关注How to Use GroupLayout教程,以了解我觉得非常强大的布局管理器。现在我自己做了一个小例子,然后尝试在Netbeans GUI Editor中做同样的事情,我发现两个代码之间存在一些差异,我想知道我是否遗漏了某些内容,或者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);
}
如您所见,我只将一个并列组定义为水平组,将一个连续组定义为垂直组。但是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只是不必要地添加了超过需要的组。
答案 0 :(得分:6)
赞赏将NetBeans GUI设计器作为一种手段,而不是替代理解Swing。总结评论,
虽然GroupLayout
是专为自动代码生成而设计的,但它可以有效地手动使用,如here和here所示。它也可以集成到建议的混合开发方法here。
有经验的开发人员明智地建议学习一个或多个流行的第三方布局,例如MigLayout
,FormLayout
或DesignGridLayout
,这些布局可以从接受人类可读的文本参数中获得一些力量。我在同一类别中看到GroupLayout
,但只是fluent interface。
在您的示例中,两个布局具有不同的调整大小行为,这可能会影响其他选择。请注意这个常见的pitfall。