首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Swing:按ESC键时如何关闭对话框?

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

Stack Overflow用户
提问于 2009-03-13 14:17:47
回答 3查看 41.3K关注 0票数 62

用Swing进行GUI开发。

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

JFileChooser组件本身已经处理了ESC键:当文件选择器显示时(嵌入在我的对话框中),我按了ESC键,文件选择器就会隐藏起来。

现在我想让我的对话框做同样的事情:当我按ESC键时,我想关闭对话框。请注意,当嵌入式文件选择器显示时,ESC键应该只隐藏它。

有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-03-13 14:21:02

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

来自我现在已经不存在的博客:

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 
    ); 
}
票数 63
EN

Stack Overflow用户

发布于 2009-03-19 06:36:56

您可以使用以下代码片段。这样更好,因为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);

}
票数 72
EN

Stack Overflow用户

发布于 2014-06-21 00:38:16

如果您正在寻找一种使用Java 8新特性的技术,请尝试使用lambda表达式:

dialog.getRootPane().registerKeyboardAction(e -> {
    window.dispose();
}, KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_IN_FOCUSED_WINDOW);

KeyStroke k = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0);
int w = JComponent.WHEN_IN_FOCUSED_WINDOW;
dialog.getRootPane().registerKeyboardAction(e -> window.dispose(), k, w);
票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/642925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档