parsecer
parsecer

Reputation: 5106

FlowLayout takes up too much vertical space, change height

I have JFrame that uses FlowLayout for buttons and BoxLayout for the JFrame and looks like this:

enter image description here

I need it to look like this:

enter image description here

For some reason the JPanel of the buttons (green) takes up too much space, while the labels on the red panel are all on the same row, instead of each on a different row.

My code is as follows:

import javax.swing.*;
import java.awt.*;
 
public class ButtonsTest extends JFrame {
    private JButton button1 = new JButton("Button1");
    private JButton button2 = new JButton("Button2");
    private JButton button3 = new JButton("Button3");
    private JButton button4 = new JButton("Button4");

    private JPanel panel = new JPanel(new FlowLayout());
    private JPanel otherPanel = new JPanel();


    public ButtonsTest()  {

        setPreferredSize(new Dimension(200, 200));
        setMinimumSize(new Dimension(200, 200));
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        panel.add(button1);
        panel.add(button2);
        panel.add(button3);
        panel.add(button4);

        panel.setBackground(Color.GREEN);
        add(panel);

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

        otherPanel.add(new Label("1"));
        otherPanel.add(new Label("2"));
        otherPanel.add(new Label("3"));
        otherPanel.setBackground(Color.RED);

        add(otherPanel);

        pack();
    }

    public static void main(String[] args) {
        ButtonsTest test = new ButtonsTest();
    }
}

What is my mistake?

Upvotes: 2

Views: 882

Answers (1)

camickr
camickr

Reputation: 324128

For some reason the JPanel of the buttons (green) takes up too much space

When using a BoxLayout, the components will grow up to the maximum size when extra space is available. So extra space is allocated to both the red and green panels.

Don't set the layout of the content pane to use a BoxLayout.

while the labels on the red panel are all on the same row, instead of each on a different row.

By default a JPanel uses a Flow layout.

The solution is to use the default BorderLayout of the JFrame.

Then you add the green panel to the frame using:

add(panel, BorderLayout.PAGE_START);

Then for the "otherPanel" you can use the BoxLayout:

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

Then you add the "otherPanel" to the frame using:

add(otherPanel, BorderLayout.CENTER);

Also, components should be added to the frame BEFORE the frame is visible. So the setVisible(...) statement should be the last statement in the constructor.

Upvotes: 3

Related Questions