- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
现在,我有一个 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
最佳答案
无意冒犯任何方向,这只是那些有历史的问题之一
最初的偏离建议(感谢@mKorbel!):buttonModel 上的 ChangeListener,检查翻转属性
细化要求:当 JMenuItem 刚刚突出显示时,同时通过键盘和鼠标悬停在上面。
细化偏差:ActionListener
当前要求:当 JMenu 或 JMenuItem“选定”属性更改时执行某些操作。
正确和完整的(事后看来,因为还没有提到键盘)答案已经在第一轮中可用:一些语义监听器“足够低级”以捕获状态变化(候选人正在翻转、装备、选择、按下 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/
我正在尝试将高斯模糊添加到场景中。我正在使用此GLSL着色器:。当您提供图像作为tDiffuse纹理时,它对图像起作用,但我正在尝试将其添加为后处理效果。我试图获取摄影机的renderTarget并将
我正在做一款天气应用程序,到目前为止还不错。现在,我想通过单击按钮来呈现一些额外的信息。我有一个5天的预报,然后想显示每一天的信息。我已经成功地过滤了数据,但无法获得要渲染的数据地图。以下是我的一些代
我正在做一款天气应用程序,到目前为止还不错。现在,我想通过单击按钮来呈现一些额外的信息。我有一个5天的预报,然后想显示每一天的信息。我已经成功地过滤了数据,但无法获得要渲染的数据地图。以下是我的一些代
我在全球安装了Create Reaction应用程序。然后我就跑了。NPX创建-反应-应用JSX。它安装了大约1460个包的所有包,但没有设置Public和src文件夹。在我的JSX文件夹中,只有1:
我是一名优秀的程序员,十分优秀!