Search code examples
javaswingjpanellayout-managerpreferredsize

Set size of jpanel on a JFrame explicitly


I have JPanel with a border, the problem is that when I add the panel on the JFrame it takes the panel size although I set the preferred size for the panel using setPreferredSize. The layout of the frame is 'BoxLayout' and here's the code:

public class ActionForm extends JFrame {


    JPanel namePanel;
    JPanel descPanel;
    JLabel actionName;
    JLabel nameLabel;
    JTextField nameTextField, descTextField;
    FlowLayout toolBarLayout = new FlowLayout();     

    public ActionForm() {
        this.setLayout(new BoxLayout(this.getContentPane(), BoxLayout.Y_AXIS));
        TitledBorder nameBorder= BorderFactory.createTitledBorder(
            "Change Description");
        nameBorder.setTitleJustification(TitledBorder.LEFT);
        namePanel = new JPanel(toolBarLayout);
        namePanel.setPreferredSize(new Dimension(150, 150));
        nameLabel = new JLabel("ButtonName");
        nameTextField = new JTextField("Action's Name", 50);
        namePanel.add(nameLabel);
        namePanel.add(nameTextField);
        namePanel.setBorder(nameBorder);
        namePanel.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
        this.add(namePanel);
    }

    public static void main(String[] args) {
        ActionForm form = new ActionForm();
        form.setVisible(true);
        form.setSize(970, 500);
        form.setResizable(false);
    }
}

Why the size of the panel doesn't change?


Solution

    • BoxLayout accepting Min/Max/preferredSize that came from JComponents layed by this LayoutManager

    • (I'm don't want to comment something, because my answer will be so long) please to compare your code with this code example, there are implemented all good (required and important) Swing rulles

    for example

    import java.awt.ComponentOrientation;
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import javax.swing.BorderFactory;
    import javax.swing.BoxLayout;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.SwingUtilities;
    import javax.swing.border.TitledBorder;
    
    public class ActionForm {
    
        private static final long serialVersionUID = 1L;
        private JFrame frame;
        private JPanel namePanel;
        private JLabel nameLabel;
        private JTextField nameTextField;
        private FlowLayout toolBarLayout = new FlowLayout();
    
        public ActionForm() {
            TitledBorder nameBorder = BorderFactory.createTitledBorder(
                "Change Description");
            nameBorder.setTitleJustification(TitledBorder.LEFT);
            namePanel = new JPanel(toolBarLayout);
            namePanel.setPreferredSize(new Dimension(150, 150));// hardCoded sizing
            namePanel.setMaximumSize(new Dimension(250, 150));  // hardCoded sizing
            namePanel.setMinimumSize(new Dimension(150, 150));  // hardCoded sizing
            nameLabel = new JLabel("ButtonName");
            nameTextField = new JTextField("Action's Name", 10);
            namePanel.add(nameLabel);
            namePanel.add(nameTextField);
            namePanel.setBorder(nameBorder);
            namePanel.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
            frame = new JFrame("Mix / Max / PreferredSize for BoxLayout");
            frame.getContentPane().setLayout(new BoxLayout(frame.getContentPane(),
                BoxLayout.Y_AXIS)); // otherwise nice exceptions java.awt.AWTError:
                                    // BoxLayout can't be shared
            frame.add(namePanel);
            frame.setPreferredSize(new Dimension(970, 500));
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setResizable(false);
            frame.pack();
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    ActionForm form = new ActionForm();
                }
            });
        }
    }