当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Swing:当按下ESC键时如何关闭对话框?》经验,为你挑选了3个好方法。

使用Swing进行GUI开发.

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

JFileChooser组件已处理本身ESC键:当显示的文件选择器(嵌入在我的对话),我按ESC键,文件选择隐藏自己.

现在我希望我的对话框也能这样做:当我按下ESC时,我想要关闭对话框.请注意,当显示嵌入式文件选择器时,ESC键应该只隐藏它.

有任何想法吗 ?



1> Ayman..:

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

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> Tom Hawtin -..:

使用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 
    ); 
}


@Tom你好,感谢你的精彩帖子,你能告诉我最好的做法,以防我在对话框中有任何文本库组件.因为如果关注它们就不起作用.

3> Java42..:

如果您正在寻找使用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);

推荐阅读
mobiledu2402851323
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有