Search code examples
javaswinglayout-managerboxlayout

Width in box layout


here is piece of my code:

pane.setLayout(new BoxLayout(pane, BoxLayout.Y_AXIS));

JPanel a = new JPanel();
a.setAlignmentX(Component.CENTER_ALIGNMENT);
a.setPreferredSize(new Dimension(100, 100));
a.setBorder(BorderFactory.createTitledBorder("aa"));
JPanel b = new JPanel();
b.setAlignmentX(Component.CENTER_ALIGNMENT);
b.setPreferredSize(new Dimension(50, 50));
b.setBorder(BorderFactory.createTitledBorder("bb"));
pane.add(a);
pane.add(b);

problem is with the width of second panel as you can see in image:

enter image description here How can I fix it ?

because in flow layout it looks like I want: enter image description here


Solution

  • As mentioned before, BoxLayout pays attention to a component's requested minimum, preferred, and maximum sizes. While you are fine-tuning the layout, you might need to adjust these sizes.¹

    import java.awt.Component;
    import java.awt.Dimension;
    import javax.swing.BorderFactory;
    import javax.swing.BoxLayout;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    
    public class BoxLayoutDemo {
        private static void createAndShowGUI(){
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.getContentPane().setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS));
    
            JPanel a = new JPanel();
            a.setAlignmentX(Component.CENTER_ALIGNMENT);
            a.setPreferredSize(new Dimension(100, 100));
            a.setMaximumSize(new Dimension(100, 100)); // set max = pref
            a.setBorder(BorderFactory.createTitledBorder("aa"));
            JPanel b = new JPanel();
            b.setAlignmentX(Component.CENTER_ALIGNMENT);
            b.setPreferredSize(new Dimension(50, 50));
            b.setMaximumSize(new Dimension(50, 50)); // set max = pref
            b.setBorder(BorderFactory.createTitledBorder("bb"));
    
            frame.getContentPane().add(a);
            frame.getContentPane().add(b);
            frame.pack();
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable(){
                @Override
                public void run() {
                    createAndShowGUI();             
                }
            });
        }
    }
    

    enter image description here

    ¹ How to Use BoxLayout: Specifying Component Sizes .