Search code examples
javaswingjframejbuttongrouplayout

How to add multiple buttons using Jbutton


I made this code using jbutton and it compiles. But when i run this code only "buttoneone" shows up and "quibutton" does not show up. This is pretty weird and I cannot understand why this happens. Please help.

import java.awt.EventQueue;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.GroupLayout;
import javax.swing.*;

public class SimpleEx extends JFrame {

  /**
   * Default constructor
   * Will be invoked when we create an instance of this class
   */
    public SimpleEx() {

        initializeUserInterface();
    }

   /**
    * Set up the window/frame just the way we want it
    */
    private void initializeUserInterface() {

      // set up the frame
        setTitle("Frame Title");
        setSize(400, 300);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

      // create the buttons
        createButtons();

    }

    /**
     * In this method we'll create ALL the buttons we'll use in the application
     */
    private void createButtons(){
      // Create a button with the label "Quit" and 
        JButton quitButton = new JButton("Quit");
      // set up the action listener
        quitButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent event) {
                System.exit(0);
            }   
        });
          JButton buttonOne = new JButton("Button 1");
      // set up the action listener
        buttonOne.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent event) {

            }   
        });
      // place the button onto the window
        Container pane = getContentPane();
        GroupLayout gl = new GroupLayout(pane);
        GroupLayout g2 = new GroupLayout(pane);
        pane.setLayout(gl);
        pane.setLayout(g2);

        gl.setAutoCreateContainerGaps(true);
        g2.setAutoCreateContainerGaps(true);

        gl.setHorizontalGroup(gl.createSequentialGroup()
                .addComponent(quitButton)
        );

        gl.setVerticalGroup(gl.createSequentialGroup()
                .addComponent(quitButton)
        );
        g2.setHorizontalGroup(g2.createSequentialGroup()
                .addComponent(buttonOne)
        );

        g2.setVerticalGroup(g2.createSequentialGroup()
                .addComponent(buttonOne)
        );
     }

    /**
     * Main method called when the application starts up
     */
    public static void main(String[] args) {

      // Set up the GUI event queue
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
              // create the main frame/window and make it visible
              SimpleEx ex = new SimpleEx();
              ex.setVisible(true);
            }
        });
    }
}

Solution

  • This statement

    pane.setLayout(g2);
    

    replaces layout gl which contains the quit button since containers can only have one layout manager. You could remove this and do

    gl.setHorizontalGroup(gl.createSequentialGroup()
        .addComponent(quitButton).addComponent(buttonOne));
    gl.setVerticalGroup(gl.createParallelGroup()
        .addComponent(quitButton).addComponent(buttonOne));