Search code examples
javaswinglayout-managerboxlayout

BoxLayout only showing last component added


Looked at some previous posts pertaining to my subject but too no avail.

Trying to align components using BoxLayout but I cannot get it to work. I have tinkered with it for some time now with different results but I can't figure it out. I have used the default FlowLayout with no problems, I am trying to learn and expand my knowledge and BoxLayout will be better for my program. I want everything to stay in alignment if the User resizes their application window. I've adjusted all the sizes this way after just trying to get it to work and failing.

package GUI;
import javax.swing.*;
import java.awt.*;

 /**
 * Created by Thunderfoot on 7/31/2016. Keep Growing!
 * Graphical User Interface
 * Needs 3 JPanels(Text area + scroll pane)(2 Buttons) (1 Button), a    JTextArea, JScrollPane, and 3 JButtons
 */
public class PrimaryFrame extends JFrame {

    //Class variables
    private static JPanel panel1, panel2, panel3;
    public static JTextArea output;

    //Constructor
    public PrimaryFrame() {
        //Frame component attributes
        final Dimension FRAME_SIZE = new Dimension(400, 400);
        final Dimension PANEL1_SIZE = new Dimension(400, 250);
        final Dimension PANEL2_SIZE = new Dimension(400, 40);
        final Dimension PANEL3_SIZE = new Dimension(400, 40);

        //JFrame is PrimaryFrame
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setPreferredSize(FRAME_SIZE);
        setMaximumSize(FRAME_SIZE);
        setTitle("Fighting Game");

        //JPanel for Text
        panel1 = new JPanel();
        panel1.setLayout(new BoxLayout(panel1, BoxLayout.PAGE_AXIS));
        panel1.setMinimumSize(PANEL1_SIZE);
        panel1.setPreferredSize(PANEL1_SIZE);
        panel1.setMaximumSize(PANEL1_SIZE);
        panel1.setBackground(Color.BLACK);

        //JPanel for Attack and Kick Buttons
        panel2 = new JPanel();
        panel2.setLayout(new BoxLayout(panel2, BoxLayout.LINE_AXIS));
        panel2.setMinimumSize(PANEL2_SIZE);
        panel2.setPreferredSize(PANEL2_SIZE);
        panel2.setMaximumSize(PANEL2_SIZE);
        panel2.setBackground(Color.BLUE);

        //JPanel for Power Attack Button
        panel3 = new JPanel();
        panel3.setLayout(new BoxLayout(panel3, BoxLayout.PAGE_AXIS));
        panel3.setMinimumSize(PANEL3_SIZE);
        panel3.setPreferredSize(PANEL3_SIZE);
        panel3.setMaximumSize(PANEL3_SIZE);
        panel3.setBackground(Color.ORANGE);
        panel3.add(Box.createHorizontalGlue());
        panel3.add(Box.createVerticalGlue());

        //JTextArea & JScrollPane
        output = new JTextArea();
        output.setEditable(false);
        JScrollPane outputScroller = new JScrollPane(output, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        outputScroller.setMaximumSize(new Dimension(375, 250));
        outputScroller.setBorder(BorderFactory.createLineBorder(Color.RED));
        panel1.add(outputScroller);
        panel1.add(Box.createHorizontalGlue());
        panel1.add(Box.createVerticalGlue());

        //Attack Button
        JButton attackButton = new JButton(" ATTACK ");
        attackButton.setMaximumSize(new Dimension(75, 30));
        attackButton.setBorderPainted(true);
        //Kick Button
        JButton kickButton = new JButton(" KICK ");
        kickButton.setMaximumSize(new Dimension(75, 30));
        kickButton.setBorderPainted(true);
        //Add components
        panel2.add(attackButton);
        panel2.add(Box.createHorizontalGlue());
        panel2.add(Box.createVerticalGlue());
        panel2.add(kickButton);
        panel2.add(Box.createHorizontalGlue());
        panel2.add(Box.createVerticalGlue());

        //Power Attack Button
        JButton powAttButton = new JButton(" POWER ATTACK ");
        powAttButton.setMaximumSize(new Dimension(150, 30));
        powAttButton.setBorderPainted(true);
        panel3.add(powAttButton);
        panel3.add(Box.createHorizontalGlue());

    }

    public void buildGUI() {
        //Add components and build GUI Frame
        this.add(panel3);
        this.add(panel2);
        this.add(panel1);

        //Set attributes
        //Pack components together inside of frame
        pack();
        //Center of screen
        setLocationRelativeTo(null);
        //Make frame visible
        setVisible(true);
    }

}

Solution

  • You have to set the Layout of your PrimaryFrame. I suggest you add an additional line to your buildGUI() method:

    public void buildGUI() {
    
            //defines the Layout for the main Frame
            this.setLayout(new GridLayout(3,1)) //its up to you wich Layout you use
    
            //Add components and build GUI Frame
            this.add(panel3);
            this.add(panel2);
            this.add(panel1);
    
            //Set attributes
            //Pack components together inside of frame
            pack();
            //Center of screen
            setLocationRelativeTo(null);
            //Make frame visible
            setVisible(true);
        }
    

    Notice GridLayout(3,1) will generate a layout with three rows and one column