【问题标题】:GroupLayout autogenerated code in NetBeansNetBeans 中的 GroupLayout 自动生成的代码
【发布时间】:2013-09-15 16:57:55
【问题描述】:

在从事 Java 编程近 4 年后,我决定自学如何编写 GUI 类,因为直到现在我一直在使用 NetBeans GUI 编辑器(我对此并不感到特别自豪,但它运行得很好,让我不必担心关于组件布局)。

问题是我正在关注How to Use GroupLayout 教程来了解这个我觉得非常强大的布局管理器。现在我自己做了一个小例子,然后尝试在 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 只是不必要地添加了超出需要的组。

【问题讨论】:

  • 只是评论:GroupLayout 被设计为与构建器一起使用,因此很难通过手动编码来使用它。我的建议是使用一个 LayoutManager,它被设计为易于在手动代码中使用,fi 是三巨头之一:MigLayout、FormLayout、DesignGridBagLayout。
  • +1 用于 sscce;请注意,两者具有不同的调整大小行为。
  • 感谢 cmets!我会看看其他布局管理器,因为,是的,很难通过手动编码来使用它。 @trashgod,您对调整大小行为是正确的。我之前没有注意到这一点。特别是我不喜欢允许调整大小,除非它是绝对必要的。大桌子或可能需要很大空间的东西。这只是我的偏好。
  • @kleopatra DesignGridLayout。 GridBagLayout 一定是不小心潜入的,不过我必须说,即使是手动使用也比 GroupLayout 容易。
  • @kiheru:我想知道。 :-)

标签: java swing netbeans grouplayout


【解决方案1】:

感谢将 NetBeans GUI 设计器作为理解 Swing 的一种手段(而不是替代品)。总结一下cmets,

  • 虽然GroupLayout 是为自动代码生成而设计的,但它也可以手动使用,如herehere 所示。它也可以集成到here建议的混合开发方法中。

  • 经验丰富的开发人员明智地建议学习一种或多种流行的第三方布局,例如 MigLayoutFormLayoutDesignGridLayout,这些布局从接受人类可读的文本参数中获得了一些力量。我看到GroupLayout 属于同一类别,但只是有一个fluent interface

  • 在您的示例中,两种布局具有不同的调整大小行为,这可能会影响其他选择。当心这种常见的pitfall

【讨论】:

  • 非常感谢您的宝贵时间。我在这里有很多要读的东西,它非常有用。尤其是关于调整大小的提示 ;)
猜你喜欢
  • 2012-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-09
  • 1970-01-01
  • 2016-03-15
  • 2010-10-04
  • 1970-01-01
相关资源
最近更新 更多