Exit Menu using ActionListener is not working

184 Views Asked by At

I'm trying to exit menu using the ActionListener, however my code doesn't work properly and the "Quit the Program" button doesn't do anything. Below is the code:

import java.awt.*;
 import java.awt.event.*;
 import javax.swing.JMenu;
 import javax.swing.JMenuItem;
 import javax.swing.JCheckBoxMenuItem;
 import javax.swing.JRadioButtonMenuItem;
 import javax.swing.ButtonGroup;
 import javax.swing.JMenuBar;
 import javax.swing.KeyStroke;
 import javax.swing.ImageIcon;
 import javax.swing.JPanel;
 import javax.swing.JTextArea;
 import javax.swing.JScrollPane;
 import javax.swing.JFrame;

 public class testCoinSorterGUI extends testCoinSorter{

JTextArea output;
JScrollPane scrollPane;

public JMenuBar createMenuBar() {
    JMenuBar menuBar;
    JMenu menu, submenu;
    JMenuItem menuItem;
    JRadioButtonMenuItem rbMenuItem;
    JCheckBoxMenuItem cbMenuItem;

    //Create the menu bar.
    menuBar = new JMenuBar();

    //Build the first menu.
    menu = new JMenu("Calculator");
    menu.setMnemonic(KeyEvent.VK_A);
    menu.getAccessibleContext().setAccessibleDescription(
            "The only menu in this program that has menu items");
    menuBar.add(menu);
    
    menuItem = new JMenuItem("Coin calculator");
    menu.add(menuItem);
    
    menuItem = new JMenuItem("Multi Coin calculator");
    menu.add(menuItem);

    //Build second menu in the menu bar.
    menu = new JMenu("Print coin list");
    menu.setMnemonic(KeyEvent.VK_N);
    menu.getAccessibleContext().setAccessibleDescription("This menu does nothing");
    menuBar.add(menu);

    //Build third menu in the menu bar.
    menu = new JMenu("Set details");
    menuBar.add(menu);

    menuItem = new JMenuItem("Set currency");
    menu.add(menuItem);

    menuItem = new JMenuItem("Set minimum coin input value");
    menu.add(menuItem);

    menuItem = new JMenuItem("Set maximum coin input value");
    menu.add(menuItem);
    menu.addSeparator();

    menuItem = new JMenuItem("Display program configurations");
    menu.add(menuItem);

    //Build fifth menu in the menu bar.
    menu = new JMenu("Quit the program");
    menuBar.add(menu);
    menu.addActionListener(
        new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        }
    );
    
    return menuBar;
}

public Container createContentPane() {
    //Create the content-pane-to-be.
    JPanel contentPane = new JPanel(new BorderLayout());
    contentPane.setOpaque(true);

    //Create a scrolled text area.
    output = new JTextArea(5, 30);
    output.setEditable(false);
    scrollPane = new JScrollPane(output);

    //Add the text area to the content pane.
    contentPane.add(scrollPane, BorderLayout.CENTER);

    return contentPane;
}

/** Returns an ImageIcon, or null if the path was invalid. */
protected static ImageIcon createImageIcon(String path) {
    java.net.URL imgURL = testCoinSorterGUI.class.getResource(path);
    if (imgURL != null) {
        return new ImageIcon(imgURL);
    } else {
        System.err.println("Couldn't find file: " + path);
        return null;
    }
}

/**
 * Create the GUI and show it.  For thread safety,
 * this method should be invoked from the
 * event-dispatching thread.
 */
private static void createAndShowGUI() {
    //Create and set up the window.
    JFrame frame = new JFrame("*** CoinSorterGUI ***");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    //Create and set up the content pane.
    testCoinSorterGUI demo = new testCoinSorterGUI();
    frame.setJMenuBar(demo.createMenuBar());
    frame.setContentPane(demo.createContentPane());

    //Display the window.
    frame.setSize(680, 480);
    frame.setVisible(true);
}

public static void main(String[] args) {
    //Schedule a job for the event-dispatching thread:
    //creating and showing this application's GUI.
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            createAndShowGUI();
        }
    });
}
}

Currently I only want to test the "quit the program" button, so please ignore all the other menu. Any help would be appreciated, I am really stucked though I think I have put the code in the correct order.

2

There are 2 best solutions below

0
muzzletov On

You could use this instead of the ActionListener, which is supposed to be use for a different range of controls:

JMenu quitProgramMenu = new JMenu("Quit the program");

quitProgramMenu.addMenuListener(
 new MenuListener() {

  @Override
  public void menuSelected(MenuEvent e) {
   System.exit(0);
  }

  @Override
  public void menuDeselected(MenuEvent e) {}

  @Override
  public void menuCanceled(MenuEvent e) {}
 }
);
menuBar.add(quitProgramMenu);
0
Avigdor Tolidano On

This is my solution:

JMenu quitProgramMenu = new JMenu("Quit the program");

quitProgramMenu .addMouseListener(new MouseListener() {
        
        
        @Override
        public void mousePressed(MouseEvent e) {
            System.exit(0);
            
        }
        
        @Override
        public void mouseExited(MouseEvent e) {
            // TODO Auto-generated method stub
            
        }
        
        @Override
        public void mouseEntered(MouseEvent e) {
            // TODO Auto-generated method stub
            
        }
        
        @Override
        public void mouseClicked(MouseEvent e) {
            // TODO Auto-generated method stub
            
        }

        @Override
        public void mouseReleased(MouseEvent e) {
            // TODO Auto-generated method stub
            
        }
    });
menuBar.add(quitProgramMenu);