我插入了一个没有任何JMenuItem的JMenu(实例名为:exitMenu),所以我的目的是提供一种方法来退出程序,而无需访问不必要的菜单项,因为我的程序只有一个JMenu对象(有人可能会说:WTF !!!但......)。
因此,为了捕获在这个特定的JMenu组件中发生的事件,我的类实现了MenuListener接口。众所周知,有三个强制实现方法,虽然我只需要使用一个,menuSelected()方法。
为了让我的程序有点直观,毫无疑问,一旦用户选择了exitMenu,(in)着名的弹出窗口JOptionPane.showConfirmDialog()就会显示他/她需要在YES或NO选项之间进行选择。
如果选择的选项为YES,则完全没问题,因为程序是通过System.exit(0)完成的。问题是NO选项,当焦点返回到程序时,exitMenu保持被选中,当然,因为我之前选择了。我想做的“事情”是在选择NO选项后立即删除对象选择,这样用户就可以再次点击它。
即使在三个强制方法(一个调用另一个)中使用exitMenu.setSelected(false),虽然exitMenu组件被“取消选择”,但必须单击它两次以调用其事件监听器。
有什么建议吗?
提前致谢。
答案 0 :(得分:5)
我尝试的一件事就是从menuSelected(...)方法中简单地调用setSelected(false)
,但这有副作用。例如,菜单似乎没有被选中,而另一个菜单则不会一直有效。
一种可行的解决方案是取消选择Swing Timer中的菜单。类似的东西:
@Override
public void menuSelected(MenuEvent mEvt) {
// show JOptionPane
// if yes selected, exit.
// Otherwise...
final JMenu menu = (JMenu) mEvt.getSource();
new Timer(200, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
menu.setSelected(false);
((Timer)e.getSource()).stop();
}
}).start();
}
答案 1 :(得分:2)
有两个级别
JMenu
有MenuListener
JMenuItem
有ButtonModel