无意冒犯任何方向,这只是那些有历史的问题之一
- 初始要求:当鼠标悬停在 JMenuItem 上时做某事
- 最初大家的宠儿:MouseListener
最初的偏离建议(感谢@mKorbel!):按钮模型上的ChangeListener,检查翻转属性
细化要求:当 JMenuItem 刚刚突出显示时,通过键盘和鼠标悬停做某事。
- 精致的宝贝:buttonModel上的ChangeListener,未指定属性
精化偏差:ActionListener
当前要求:当 JMenu 或 JMenuItem "selected" 属性改变时做一些事情。
- 当前的宠儿:不能用听众来完成,覆盖......
- 当前偏差:Action、MenuListener ...
正确和完整(事后看来,虽然键盘还没有提到)答案已经在第一轮中可用:一些语义侦听器“足够低级”以捕获状态变化(候选是翻转、武装、已选中,在 buttonModel 级别上按下),这会使 menuItems 更改其突出显示状态。不幸的是,确切的关系并不为人所知(至少对我而言),没有记录(阅读:懒惰的我无法快速查看任何内容)甚至令人困惑(再次对我而言),因为翻转总是错误的(?)对于菜单项
实验者的反应是.. try: 下面是一个代码片段,它监听并记录一些菜单树上的状态变化(只需放入任意菜单栏并移动鼠标并通过键盘导航)。
获胜者是: - 使用 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
//----------- 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;
}