现在,我有一个JMenu,其中有一些JMenuItems。我希望我的程序在JMenu's和JMenuItem的状态更改为"选定"时执行一些操作。我不使用MouseLitener的MouseOver,因为我希望用户也能够使用键盘在菜单中导航。现在,我写了这个监听器:

class MenuItemListener implements ChangeListener {
    @Override
    public void stateChanged(ChangeEvent arg0) {
        JMenuItem item = (JMenuItem) arg0.getSource();
        if(item.isSelected())
            System.out.println(item.getText()+" pressed!");
    }
}

当我将此侦听器添加到JMenu时,它可以正常工作,但是当我将其添加到JMenuItem时,没有任何反应。..当我删除if语句,以便侦听器同时反应时,当菜单被选择和取消选择时,我对JMenu和JMenuItem都能正常工作。所以,正如我所看到的,JMenuItem无法"通过"isSelected()测试。..但有什么问题呢?:S

有帮助吗?

解决方案

在任何方向上没有冒犯,这只是历史的问题之一

  • 初始要求:当鼠标超过Jmenuitem 时做一些事情
  • 最初的每个人的宠儿:mouseListener
  • 初始偏离建议(kudos to @mkorbel!):Cuttonmodel上的changeListener,检查翻转属性

  • 精细要求:当jmenuitem刚刚突出显示的时,通过键盘和鼠标突出显示。

  • 精致的达令:Buttonmodel上的Chandelistener,财产未指定
  • 精细偏差:ActionListener

  • 当前要求:当jmenu或jmenuitem“选中”属性发生了更改时的通讯。

  • 目前的宠儿:无法用侦听器完成,覆盖...
  • 当前偏差:动作,培养器...

    正确和完整的(尽管如此,当尚未提及的键盘上尚未提及)答案已在第一轮中提供:一些语义侦听器是“低级足够”以捕获状态变化(候选者是翻转的,武装,选中,按下按钮级别,使MenuItems更改其突出显示状态。不幸的是,确切的关系并不众所周知(至少对我来说,至少),未记录(阅读:懒惰我找不到任何东西可以快速看),甚至偶尔(再次对我来说)汇总为false(?)对于menuiuems “实验主义的反应是..尝试:以下是一个代码片段侦听和记录某些菜单树上的状态更改(只需抛入任意菜单栏并移动鼠标并由键盘导航)。

    和获胜者是: - 使用ChandeListener并检查源是否选择或武装。

        ChangeListener ch = new ChangeListener() {
    
            @Override
            public void stateChanged(ChangeEvent e) {
                if (e.getSource() instanceof JMenuItem) {
                    JMenuItem item = (JMenuItem) e.getSource();
                    if (item.isSelected() || item.isArmed()) {
                        System.out.println("Highlighted: " + item.getActionCommand());
                    }
                }
            }
        };
    
    .

    适用于键盘和鼠标,jmenu和jmenuitem

    //----------- code snippet to track property changes in menuItem/buttonModel
    
        // test menu
        JMenu menu = new JMenu("Sample menu");
        menu.setMnemonic('s');
        installListeners(menu);
    
        // first menuitem
        JMenuItem other = menu.add("content1");
        installListeners(other);
        // second menuitem
        other = menu.add("again + ");
        installListeners(other);
    
        // sub
        JMenu sub = new JMenu("subMenu");
        installListeners(sub);
        menu.add(sub);
    
        // menus in sub
        other = sub.add("first in sub");
        installListeners(other);
        other = sub.add("second in sub");
        installListeners(other);
    
        getJMenuBar().add(menu);
    
    private void installListeners(JMenuItem menu) {
        menu.getModel().addChangeListener(getChangeListener());
        menu.addChangeListener(getChangeListener());
    }
    
    private ChangeListener getChangeListener() {
        ChangeListener ch = new ChangeListener() {
    
            @Override
            public void stateChanged(ChangeEvent e) {
                if (e.getSource() instanceof ButtonModel) {
                    ButtonModel model = (ButtonModel) e.getSource();
                    System.out.println("from model: " + createStateText(model));
                } else if (e.getSource() instanceof JMenuItem) {
                    JMenuItem item = (JMenuItem) e.getSource();
                    System.out.println("  from item: " + createStateText(item));
                }
            }
    
            private String createStateText(ButtonModel model) {
                String text = model.getActionCommand() + " armed: " + model.isArmed();
                text += " selected: " + model.isSelected();
                text += " rollover " + model.isRollover();
                text += " pressed: " + model.isPressed();
                return text;
            }
    
            private String createStateText(JMenuItem model) {
                String text = model.getActionCommand() + " armed: " + model.isArmed();
                text += " selected: " + model.isSelected();
                // not supported on JMenuItem nor on AbstractButton
               // text += " rollover " + model.isRollover();
               // text += " pressed: " + model.isPressed();
                return text;
            }
        };
        return ch;
    }
    
    .

其他提示

这是预期的多态行为。该 isSelected() 的方法 JMenuItem 是继承自 AbstractButton, ,而同样的方法在 Jmenu 被复盖,以便"如果菜单当前被选中(突出显示),则返回true。"

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top