Java 如何将JMenuItem链接到JButton

Java 如何将JMenuItem链接到JButton,java,swing,jbutton,exit,jmenuitem,Java,Swing,Jbutton,Exit,Jmenuitem,假设我有一个JMenuItem,里面有一个文本“Exit”,还有一个JButton,里面有一个文本“Exit”, JButton将使用的命令是System.exit(0),当然是使用Action Listener,好的,我知道,我可以在单击JMenuItem时输入相同的代码,但是没有一种方法,当我单击JMenuItem时,JButton被单击,然后执行以下命令(JButton命令) 一个好方法是为两个组件设置相同的ActionListener。像这样: JButton button = new

假设我有一个JMenuItem,里面有一个文本“Exit”,还有一个JButton,里面有一个文本“Exit”,
JButton将使用的命令是System.exit(0),当然是使用Action Listener,好的,我知道,我可以在单击JMenuItem时输入相同的代码,但是没有一种方法,当我单击JMenuItem时,JButton被单击,然后执行以下命令(JButton命令)

一个好方法是为两个组件设置相同的
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)
。关闭程序的更好方法(我假设基本上是一个
JFrame
)是设置

frame.setDefaultCloseOperation(JFrame.DISPOSE\u ON\u CLOSE)

(其中,
frame
是程序的窗口)


ActionListener

中调用
frame.dispose()
,您可以创建一个
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);

我认为最好的办法是在JMENUIGET和JButton的事件侦听器中登记相同的ActualListNever实例,就像使用旧的命令设计模式。
我不建议尝试欺骗事件“引擎”,比如让JMenuItem触发与按下JButton相关的事件,因为这并不是正在发生的事情,但您似乎希望将这两个操作重复用于两个不同的事件。

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

private JButton button;
并在菜单项的click事件处理程序中插入代码

button.doClick();

但是的解决方案更优雅。

实际上,最好将其封装在一个动作中。这样,您也可以使用键绑定。至于关闭应用程序,我发现依赖System.exit比祈祷我所有的帧都消失,所有剩余的线程都被释放要干净得多