GroupLayout在NetBeans中自动生成代码
在java编程近4年后,我决定学习如何自己编写GUI类,因为直到现在我一直使用NetBeans GUI编辑器(我并不是特别自豪,但它工作得很好,避免了我担心组件布局)。
问题是我在下面如何使用GroupLayout教程来了解这个布局pipe理器,我发现它非常强大。 现在我自己做了一个小例子,然后尝试在Netbeans GUI编辑器中做同样的事情,我发现两个代码之间有一些差异,我想知道我是否错过了一些东西,或者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只是不必要地增加了超过需要的组。
对拥抱NetBeans GUIdevise师的赞誉是一种手段,而不是Swing的替代理解。 总结评论,
-
虽然
GroupLayout
是为自动代码生成而devise的,但可以手动使用它,如下所示。 它也可以融入到这里提出的混合开发方法中。 -
有经验的开发人员明智地build议学习一个或多个stream行的第三方布局,如
MigLayout
,FormLayout
或DesignGridLayout
,它们通过接受人类可读的文本参数来获得一定的权力。 我看到GroupLayout
在相同的类别,但只是有一个stream畅的界面 。 -
在你的例子中,这两个布局有不同的调整行为,这可能会影响其他select。 小心这个常见的陷阱 。