2

假设我有一个带有“Exit”文本的 JMenuItem,还有一个带有“Exit”文本的 JButton,JButton 将使用的命令是 System.exit(0),当然使用 Action Listener,我知道,我可以在单击 JMenuItem 时放置相同的代码,但没有办法,当我单击 JMenuItem 时,单击 JButton,然后执行以下命令(JButton 命令)?

4

4 回答 4

8

您可以做的是创建一个Action对象,并将其用于您的JButton和您的JMenuItem.

Action exit = new AbstractAction() {
        private static final long serialVersionUID = -2581717261367873054L;

        @Override
        public void actionPerformed(ActionEvent e) {
            System.exit(0);
        }
    };
exit.putValue(Action.NAME, "Exit");
exit.putValue(Action.MNEMONIC_KEY, KeyEvent.VK_X);

JButton exitButton = new JButton(exit);
JMenuItem exitItem = new JMenuItem(exit);
于 2012-05-24T14:53:41.797 回答
4

一个很好的方法是ActionListener为两个组件设置相同的值。像这样:

JButton button = new JButton ("Exit");
JMenuItem item = new JMenuItem ("Exit");

ActionListener exitaction = new ActionListener ()
{
    public void actionPerformed (ActionEvent e)
    {
        System.exit (0);
    }
};

button.addActionListener (exitaction);
item.addActionListener (exitaction);

但是,我建议不要使用System.exit (0). 关闭程序的更好方法(我假设基本上是 a JFrame)是通过设置

frame.setDefaultCloseOperation (JFrame.DISPOSE_ON_CLOSE)

frame程序的窗口在哪里)

并调用frame.dispose ().ActionListener

于 2012-05-24T14:53:30.763 回答
0

您可以尝试将按钮保存为类字段

private JButton button;

并在菜单项的单击事件处理程序中插入代码

button.doClick();

SoboLAN的解决方案更优雅。

于 2012-05-24T14:56:06.783 回答
0

我认为最好的方法是在 JMenuItem 和 JButton 的事件侦听器中注册相同的 ActionListener 实例,这就像使用旧的 Command 设计模式一样。

我不建议尝试欺骗事件“引擎”,例如让 JMenuItem 触发与按下 JButton 相关的事件,因为这不是正在发生的事情,但您似乎想要将这两个动作重用于 2 个不同的事件。

于 2012-05-24T14:54:20.820 回答