没有任何方向的冒犯,这只是有历史的问题之一
- 初始要求:鼠标悬停在JMenuItem上时执行的操作
- 最初的每个人的宠儿:MouseListener
最初的偏离建议(对@mKorbel表示敬意):buttonModel上的ChangeListener,检查过渡属性
改进的要求:当JMenuItem刚刚突出显示时,可以通过键盘和鼠标悬停在doSomething上。
精致的宝贝:buttonModel上的ChangeListener,未指定属性
精确偏差:ActionListener
当前要求:更改JMenu或JMenuItem“选定”属性时的doSomething。
当前的宠儿:无法用监听器完成,请覆盖…
- 当前偏差:动作,MenuListener …
正确而完整的答案(事后看来,因为尚未提及键盘)在第一轮中就已经存在:某种语义监听器“足够低级”以捕获状态变化(候选者是过渡,武装,选中,在buttonModel级别上按下),使menuItem更改其
突出显示
状态。不幸的是,确切的关系尚不为人所知(至少对我而言),没有文档记录(请阅读:懒惰的我很快就找不到任何内容),甚至由于再次总是错误的(对我来说)而令人困惑(?)用于menuItems
实验人员的反应是尝试..
try:下面是一个代码段,该代码段侦听并记录某些菜单树上的状态更改(只需将其放入任意menuBar中并在鼠标周围移动并通过键盘进行导航)。
获胜者是:-使用ChangeListener并检查源是否已选择或已配置。
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
//----------- pre 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;}


