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

时间:2009-03-13 14:17:47

标签: java user-interface swing

使用Swing进行GUI开发。

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

{{1}}组件本身已经处理了ESC键:当显示文件选择器(嵌入在我的对话框中)并按ESC时,文件选择器隐藏自己。

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

有什么想法吗?

5 个答案:

答案 0 :(得分:63)

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

}

答案 1 :(得分:59)

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

来自我的weblog

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

答案 2 :(得分:13)

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

答案 3 :(得分:4)

我在实现两个最佳答案时遇到了问题。这是一个相当紧凑的版本,使用AbstractAction自动实现大多数Action的方法,这些方法在基于文本的字段中工作(根据@ pratikabu的请求):

final AbstractAction escapeAction = new AbstractAction() {
    private static final long serialVersionUID = 1L;

    @Override
    public void actionPerformed(ActionEvent ae) {
        dispose();
    }
};

getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
        .put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "ESCAPE_KEY");
getRootPane().getActionMap().put("ESCAPE_KEY", escapeAction);

参考

答案 4 :(得分:2)

这是我的,我添加 Ctrl W 作为关闭shorcut以及

from matplotlib.dates import bytespdate2num
dates=np.loadtxt('data.csv',delimiter=',',usecols=(1,),
             converters={ 1:bytespdate2num('%d-%m-%Y')})