JMenu ActionListener
Asked Answered
R

3

16

I was wondering if can you test to see if a JMenu (not JMenuItem) has been clicked. I tried adding an ActionListener to it but it doesn't seem to recognize it. I just need it to preform an action when the JMenu button is pressed so that I can change the JMenuItems for that menu befor it opens. All work arrounds to get this result are welcome too!

Thanks

Ravelin answered 25/3, 2012 at 17:6 Comment(7)
Have you tried addMenuListener?Scandinavian
No I'm using addActionListener right now but to add that I run into some problems, shouldn't actionListener work aswell though?Ravelin
Why change the menu items on JMenu click? Why not change it before the click? What is your "use case" here?Rumple
mre, that only works for JMenuItems I need a listener for a JMenuRavelin
Hovercraft, I'm using it to determine whether or not certain JMenuItems are enabled and I thought it would be an easy way to test it without using threads...Ravelin
"determine whether or not certain JMenuItems are enabled" setEnabled(boolean) is not enough?Lather
I'm still not quite sure what your goal is. You can trap Menu clicks with a ChangeListener, however the rationale has a funny smell to me.Rumple
D
21
  • for JMenu use MenuListener

code

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class ActionExample {

    public ActionExample() {

        JMenu menu = new JMenu("Menu");
        menu.setMnemonic(KeyEvent.VK_M);
        menu.addMenuListener(new SampleMenuListener());
        JMenu menu1 = new JMenu("Tool");
        menu1.setMnemonic(KeyEvent.VK_T);
        menu1.addMenuListener(new SampleMenuListener());
        JFrame f = new JFrame("ActionExample");
        JMenuBar mb = new JMenuBar();
        mb.add(menu);
        mb.add(menu1);
        f.setJMenuBar(mb);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                ActionExample actionExample = new ActionExample();
            }
        });
    }
}

class SampleMenuListener implements MenuListener {

    @Override
    public void menuSelected(MenuEvent e) {
        System.out.println("menuSelected");
    }

    @Override
    public void menuDeselected(MenuEvent e) {
        System.out.println("menuDeselected");
    }

    @Override
    public void menuCanceled(MenuEvent e) {
        System.out.println("menuCanceled");
    }
}
Dykstra answered 25/3, 2012 at 18:35 Comment(0)
A
0

I think it's possible to use a MouseListener to fire actions in JMenu without JMenuItem.

JMenu myMenu = new JMenu("My menu");

myMenu.addMouseListener(new MouseListener() {
  @Override
  public void mouseClicked(MouseEvent e) {
    // action here
  }

  @Override
  public void mousePressed(MouseEvent e) {
  }

  @Override
  public void mouseReleased(MouseEvent e) {
  }

  @Override
  public void mouseEntered(MouseEvent e) {
  }

  @Override
  public void mouseExited(MouseEvent e) {
  }
});

menuBar.add(myMenu);
Appleton answered 29/10, 2021 at 21:56 Comment(1)
In this case, where we're only overriding a single method, use MouseAdapter for cleaner code.Grilled
D
-1

With an instance of JMenu you can't add an ActionListener, only with JMenuItem you can do it.

Douro answered 23/1, 2017 at 18:52 Comment(1)
We can add an ActionListener to JMenu, but it just doesn't have any effect. JMenu opens its child JMenus and JMenuItems when the mouse hovers over it. I think the question is about the extra functionality to perform an action when clicking on the JMenu.Grilled

© 2022 - 2024 — McMap. All rights reserved.