Swing GroupLayout:调整和限制组件大小

时间:2011-12-13 15:50:51

标签: java swing grouplayout

我正在使用GroupLayout来管理一些动态生成的数据输入表单中的组件。布局或多或少如此:

*-----------------------------------------------*
| label A     |   field A                       | 
| label B     |   field B                       |
| label C     |   field C                       |
*-----------------------------------------------*

我使用2个并行组作为水平布局,使用单个顺序组作为垂直布局。在大多数情况下,一切都运转正常。

我想将标签的最大宽度(只是JLabel的实例)限制为父JFrame宽度的1/3。如果JFrame是一个固定的大小,这将是微不足道的,但我必须处理它被调整大小。

我正在接收来自ComponentListener.componentResized()的{​​{1}}个事件,但是一旦我收到这样的事件,我就会有点不知所措。

我没有运气就试过这种方法:

JFrame

有人可以建议一种限制标签宽度的方法吗?

我每次都可以从头开始重建布局,但我觉得应该有一种更简单的方法。

1 个答案:

答案 0 :(得分:27)

在此示例中,GroupLayout可以简单地依赖于标签的首选大小,而无需使用任何setXXXSize()方法。在这种方法中,

  • 标签的空间始终容纳最大的标签。
  • 文本字段可以通过有用的方式调整大小。
  • 跨平台和字体的结果是正确的。
  • “您不需要为大多数组件指定任何内容......因为组件本身具有默认的所需调整大小行为。” - How to Use GroupLayout: Component Size and Resizability

使用GroupLayout.Alignment.TRAILING对标签进行右对齐是个人偏好,我添加了第二个面板来展示它是如何嵌套在另一个布局中的。

enter image description here

import java.awt.EventQueue;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.GroupLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

/** @see http://stackoverflow.com/questions/8492065 */
public class GroupPanel extends JPanel {

    private JLabel label1 = new JLabel("Primary:");
    private JTextField field1 = new JTextField(16);
    private JLabel label2 = new JLabel("Secondary:");
    private JTextField field2 = new JTextField(16);
    private JLabel label3 = new JLabel("Tertiary:");
    private JTextField field3 = new JTextField(16);

    public GroupPanel(int n) {
        this.setBorder(BorderFactory.createTitledBorder("Panel " + n));
        GroupLayout layout = new GroupLayout(this);          
        this.setLayout(layout);
        layout.setAutoCreateGaps(true);
        layout.setAutoCreateContainerGaps(true);
        layout.setHorizontalGroup(layout.createSequentialGroup()
            .addGroup(layout.createParallelGroup(GroupLayout.Alignment.TRAILING)
                .addComponent(label1)
                .addComponent(label2)
                .addComponent(label3))
            .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
                .addComponent(field1)
                .addComponent(field2)
                .addComponent(field3))
        );
        layout.setVerticalGroup(layout.createSequentialGroup()
            .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
                .addComponent(label1)
                .addComponent(field1))
            .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
                .addComponent(label2)
                .addComponent(field2))
            .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
                .addComponent(label3)
                .addComponent(field3))
        );
    }

    private static void display() {
        JFrame f = new JFrame("GroupPanel");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLayout(new BoxLayout(f.getContentPane(), BoxLayout.Y_AXIS));
        f.add(new GroupPanel(1));
        f.add(new GroupPanel(2));
        f.add(Box.createVerticalGlue());
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                display();
            }
        });
    }
}