Search code examples
javaswingjbuttonactionlistenerjoptionpane

GridLayout JButton JOptionPane with ActionListener for each button


I am making a dating game in the style of the Japanese dating game with pictures and responses for fun and practice. I am trying to have a JOptionPane message dialog show up for each button in a grid layout as a response to each option. In this way it's like a logic tree. I am not used to using action listener as I am somewhat of a beginner. Here is my code. I am just not used to the syntax of doing this.

Can anyone help me?

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.util.Scanner;
import javax.swing.JFrame;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.*;
//Implementations of packages

public class NestedPanels extends JPanel {
   private static final String[] BTN_TEXTS = { "Say Hello", "Say You Look Good", "Say Sorry I'm Late" }; //three buttons
   private static final int TITLE_POINTS = 3; //number of objects in text box

   public NestedPanels() { //implemeted class
      JPanel southBtnPanel = new JPanel(new GridLayout(3, 2, 1, 1)); //grid layout of buttons and declaration of panel SoutbtnPanel
      for (String btnText : BTN_TEXTS) { //BTN TEXT button titles linked to string btnText label
         southBtnPanel.add(new JButton(btnText)); //add btnText label
      }
      setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1)); //layout of buttons "Button text"
      setLayout(new BorderLayout());
      add(Box.createRigidArea(new Dimension(600, 600))); //space size of text box webapp over all
      add(southBtnPanel, BorderLayout.SOUTH);
   }

   private static void createAndShowGui() {//class to show gui
        NestedPanels mainPanel = new NestedPanels(); //mainPanel new class of buttons instantiation
        JFrame frame = new JFrame("Date Sim 1.0");//title of webapp on top
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setVisible(true);
        ImageIcon icon = new ImageIcon("C:/Users/wchri/Pictures/10346538_10203007241845278_2763831867139494749_n.jpg");
        JLabel label = new JLabel(icon);
        mainPanel.add(label);
        frame.setDefaultCloseOperation
        (JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
   }

   public static void main(String[] args) {
        System.out.println("Welcome to Date Sim 1.0 with we1. Are you ready to play? Yes/No?");

        Scanner in = new Scanner(System.in);

        String confirm = in.nextLine();

        if (confirm.equalsIgnoreCase("Yes")) {
            System.out.println("Ok hot stuff... Let's start.");

            NestedPanels mainPanel = new NestedPanels();
        } else {
            System.out.println("Maybe some other time!");

            return;
        }

         SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

Solution

  • Review the following to get an idea of how to add action listener to buttons.
    Please note the comments:

    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.BorderFactory;
    import javax.swing.Box;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    
    public class NestedPanels extends JPanel {
    
        private static final String[] BTN_TEXTS = { "Say Hello", "Say You Look Good", "Say Sorry I'm Late" }; //three buttons
        //never used :   private static final int TITLE_POINTS = 3;
        public NestedPanels() {
    
            JPanel southBtnPanel = new JPanel(new GridLayout(3, 2, 1, 1));
            for (String btnText : BTN_TEXTS) {
                JButton b = new JButton(btnText);
                //add action listener
                b.addActionListener(new ActionListener() {
    
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        buttonClicked(e);//when button clicked, invoke method
                    }
                });
    
                //alternative much shorter way to add action listener:
                //b.addActionListener(e -> buttonClicked());
                southBtnPanel.add(b);
            }
            setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1));
            setLayout(new BorderLayout());
    
            //this adds Box to the default  BorderLayout.CENTER position
            add(Box.createRigidArea(new Dimension(600, 600)));
    
            add(southBtnPanel, BorderLayout.SOUTH);
        }
    
        //respond to button clicked
        private void buttonClicked(ActionEvent e) {
            String msg = ((JButton)e.getSource()).getActionCommand()+" pressed" ;
            JOptionPane.showMessageDialog(this, msg ); //display button Action
        }
    
        private static void createAndShowGui() {
            NestedPanels mainPanel = new NestedPanels();
            JFrame frame = new JFrame("Date Sim 1.0");
            //no need to invoke twice frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            //no need to invoke twice  frame.pack();
            //no need to invoke twice frame.setVisible(true);
    
            frame.getContentPane().add(mainPanel);
    
            /*
             * when posting images, use web resources that anyone can access
             *
            ImageIcon icon = new ImageIcon("C:/Users/wchri/Pictures/10346538_10203007241845278_2763831867139494749_n.jpg");
            JLabel label = new JLabel(icon);
    
            *this adds label to the default BorderLayout.CENTER position, which is already taken by
            *the Box. Only one (last) component will be added
            mainPanel.add(label);
            *
            */
    
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack();
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            //remove all code which is not essential to the question
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    createAndShowGui();
                }
            });
        }
    }