Swing GroupLayout: Resizing and limiting component sizes

后端 未结 1 518
暖寄归人
暖寄归人 2020-11-22 08:45

I\'m using GroupLayout to manage components in some dynamically generated data input forms. The layout is more or less like so:

*---------------         


        
相关标签:
1条回答
  • 2020-11-22 09:38

    In this example, GroupLayout can simply rely on the preferred size of the label, without having to resort to any setXXXSize() method. In this approach,

    • The space for the labels always accommodates the largest label.
    • The text fields are resizable in a useful way.
    • The result is correct across platforms and fonts.
    • "You do not need to specify anything for most of the components…because the components themselves have the desired resizing behavior as default."—How to Use GroupLayout: Component Size and Resizability

    The use of GroupLayout.Alignment.TRAILING to right justify the labels is a personal preference, and I've added a second panel to show how it works nested in another layout.

    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();
                }
            });
        }
    }
    
    0 讨论(0)
提交回复
热议问题