Swing:如何在按下 ESC 键时关闭对话框?

2022-08-31 15:47:34

使用 Swing 进行 GUI 开发。

我有一个自定义对话框,用于选择要在我的应用程序中打开的文件;它的类扩展并包含,除其他组件外,还可以切换以显示或隐藏。javax.swing.JDialogJFileChooser

该组件已经自行处理 ESC 键:当显示文件选择器(嵌入在我的对话框中)并且我按 ESC 时,文件选择器会隐藏自身。JFileChooser

现在,我希望我的对话框执行相同的操作:当我按 ESC 时,我希望对话框关闭。请注意,当显示嵌入式文件选择器时,ESC 键应仅将其隐藏。

有什么想法吗?


答案 1

您可以使用以下代码段。这更好,因为 rootPane 将从对话框中的任何组件获取事件。如果需要,您可以将 setVisible(false) 替换为 dispose()。

public static void addEscapeListener(final JDialog dialog) {
    ActionListener escListener = new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            dialog.setVisible(false);
        }
    };

    dialog.getRootPane().registerKeyboardAction(escListener,
            KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0),
            JComponent.WHEN_IN_FOCUSED_WINDOW);

}

答案 2

使用 和 处理 Swing 中的关键操作。要干净地关闭对话框,请向其发送窗口关闭事件。InputMapActionMap

来自我现在已经失效的博客:

private static final KeyStroke escapeStroke = 
    KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0); 
public static final String dispatchWindowClosingActionMapKey = 
    "com.spodding.tackline.dispatch:WINDOW_CLOSING"; 
public static void installEscapeCloseOperation(final JDialog dialog) { 
    Action dispatchClosing = new AbstractAction() { 
        public void actionPerformed(ActionEvent event) { 
            dialog.dispatchEvent(new WindowEvent( 
                dialog, WindowEvent.WINDOW_CLOSING 
            )); 
        } 
    }; 
    JRootPane root = dialog.getRootPane(); 
    root.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put( 
        escapeStroke, dispatchWindowClosingActionMapKey 
    ); 
    root.getActionMap().put( dispatchWindowClosingActionMapKey, dispatchClosing 
    ); 
}

推荐