JMenu ActionListener

16

我想知道是否可以测试一下JMenu(而不是JMenuItem)是否被点击。 我尝试向其添加ActionListener,但它似乎无法识别。 我只需要在按下JMenu按钮时执行一个操作,以便在打开该菜单之前更改该菜单的JMenuItems。 欢迎使用所有解决此问题的方法!

谢谢


你尝试过使用addMenuListener吗? - assylias
不,我现在正在使用addActionListener,但是在添加时遇到了一些问题,不过actionListener也应该可以工作吧? - clankfan1
2
为什么要在JMenu点击时更改菜单项?为什么不在点击之前更改?你的“用例”是什么? - Hovercraft Full Of Eels
确定某些JMenuItems是否启用,setEnabled(boolean)不够吗? - Andrew Thompson
我仍然不太确定您的目标是什么。您可以使用ChangeListener捕获菜单点击,但是我的理解感觉有点奇怪。 - Hovercraft Full Of Eels
显示剩余2条评论
3个回答

21
  • 使用MenuListener来处理JMenu

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");
    }
}

0

我认为可以使用MouseListener在JMenu中触发操作,而不需要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);

在这种情况下,我们仅覆盖一个方法,请使用MouseAdapter以使代码更加简洁。 - Hummeling Engineering BV

-1

使用JMenu的实例无法添加ActionListener,只有使用JMenuItem才能这样做。


我们可以为JMenu添加一个ActionListener,但它似乎没有任何效果。当鼠标悬停在JMenu上时,它会打开其子菜单和菜单项。我认为问题是关于在单击JMenu时执行额外功能的。 - Hummeling Engineering BV

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接