Macos 如何配置Swing JFrame以在Cmd-W上关闭?

Macos 如何配置Swing JFrame以在Cmd-W上关闭?,macos,swing,Macos,Swing,在OSX上,用户希望能够按Cmd-W关闭窗口 我可以配置JFrame来执行此操作吗?您应该能够像这样指定菜单快捷方式: menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W, ActionEvent.META_MASK)); 通常,顶级窗口的键绑定由底层操作系统专门处理。所以在Mac上,它们应该已经存在了,在另一个系统上,没有元密钥(?不确定,不过,可能有一些模拟) 无论如何,

在OSX上,用户希望能够按Cmd-W关闭窗口


我可以配置JFrame来执行此操作吗?

您应该能够像这样指定菜单快捷方式:

menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W, 
                        ActionEvent.META_MASK));

通常,顶级窗口的键绑定由底层操作系统专门处理。所以在Mac上,它们应该已经存在了,在另一个系统上,没有元密钥(?不确定,不过,可能有一些模拟)

无论如何,您可以向JFrame的根窗格添加任何附加的键绑定:

private void addMacCloseBinding(JFrame frame) {
    frame.getRootPane().getActionMap().put("close-window", new CloseAction(frame));
    frame.getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT)
        .put(KeyStroke.getKeyStroke("control W"), "close-window");
    frame.getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT)
        .put(KeyStroke.getKeyStroke("meta W"), "close-window");
}

public class CloseAction extends AbstractAction {

    private Window window;
    public CloseAction(Window window) {
        this.window = window;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (window == null) return;
        window.dispatchEvent(new WindowEvent(
                window, WindowEvent.WINDOW_CLOSING));
    }

}

谢谢-我必须删除聚焦组件的
WHEN\u consensor\u
约束,以使其在我的特定情况下(一个JFrame,其中一个JFreeChart ChartPanel作为其唯一的子项)工作,但除此之外,这正是关键所在。