5

我插入了一个没有任何 JMenuItem 的 JMenu(实例名为:exitMenu),所以我的目的是提供一种方法来退出程序而无需访问不必要的菜单项,因为我的程序只有一个 JMenu 对象(有人可能会说:WTF! !! 但...)。

因此,为了捕获在这个特定的 JMenu 组件中发生的事件,我的类实现了 MenuListener 接口。众所周知,强制实现方法有三种,虽然我只需要使用一种,menuSelected() 方法。

毫无疑问,为了让我的程序更直观一点,一旦用户选择了 exitMenu,(in) 著名的弹出窗口 JOptionPane.showConfirmDialog() 就会出现在他/她需要在“是”或“否”选项之间进行选择的地方。

如果选择的选项是 YES,则完全没有问题,因为程序是通过 System.exit(0) 完成的。问题是 NO 选项,当焦点返回程序时,exitMenu 仍然处于选中状态,当然,因为我之前已经选择了。我想做的“事情”是在选择 NO 选项后立即删除对象选择,这样用户就可以再次单击它。

即使在三个强制方法(一个调用另一个)中使用 exitMenu.setSelected(false),虽然 exitMenu 组件已“取消选择”,但仍需要单击它两次才能调用其事件侦听器。

有什么建议吗?

提前致谢。

4

2 回答 2

6

我尝试的一件事是简单地setSelected(false)从 menuSelected(...) 方法中调用,但这有副作用。一方面,菜单似乎没有被选中,另一方面,它并不总是有效。

一种可行的解决方案是取消选择 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();
     }
于 2012-04-16T21:58:20.427 回答
2

有两个级别,对于

  • JMenuMenuListener

  • JMenuItemButtonModel

于 2012-04-17T06:54:25.720 回答