gpt4 book ai didi

java - 为什么我的 ChangeListener 只对 JMenu 有反应,而不对 JMenuItem 有反应?

转载 作者:搜寻专家 更新时间:2023-11-01 01:29:30 25 4
gpt4 key购买 nike

现在,我有一个 JMenu 和其中的一些 JMenuItems。当 JMenu 和 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!");
}
}

When I add this listener to JMenu, it works properly, but when I add it to JMenuItem, nothing happens... When I delete if statement so that listener reacts both, when menu is selected and diselected I works fine for JMenu以及 JMenuItem。所以,正如我所见,JMenuItem 无法“通过”isSelected() 测试……但是有什么问题呢? :S

最佳答案

无意冒犯任何方向,这只是那些有历史的问题之一

  • 初始要求:当鼠标悬停在 JMenuItem 上时执行操作
  • 初始大家的心肝宝贝:MouseListener
  • 最初的偏离建议(感谢@mKorbel!):buttonModel 上的 ChangeListener,检查翻转属性

  • 细化要求:当 JMenuItem 刚刚突出显示时,同时通过键盘和鼠标悬停在上面。

  • 精致宝贝:buttonModel 上的 ChangeListener,未指定属性
  • 细化偏差:ActionListener

  • 当前要求:当 JMenu 或 JMenuItem“选定”属性更改时执行某些操作。

  • 当前的宠儿:不能用监听器来完成,覆盖...
  • 当前偏差:Action、MenuListener ...

正确和完整的(事后看来,因为还没有提到键盘)答案已经在第一轮中可用:一些语义监听器“足够低级”以捕获状态变化(候选人正在翻转、装备、选择、按下 buttonModel 级别),这会使菜单项更改其突出显示状态。不幸的是,确切的关系并不为人所知(至少对我而言),没有记录(阅读:懒惰的我无法快速查看任何东西)甚至令人困惑(再次对我而言)因为翻转总是错误的(?)对于菜单项

实验者的 react 是..尝试:下面是一个代码片段,它监听并记录某些菜单树上的状态变化(只需将其放入任意菜单栏并四处移动鼠标并通过键盘导航)。

获胜者是:- 使用 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;
}

关于java - 为什么我的 ChangeListener 只对 JMenu 有反应,而不对 JMenuItem 有反应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5973875/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com