摇摆:如何按ESC键时closures对话框?

用Swing开发GUI。

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

JFileChooser组件已经自己处理了ESC键:当文件select器显示出来(embedded在我的对话框中),然后按下ESC键,文件select器自动隐藏起来。

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

有任何想法吗 ?

使用InputMapActionMap来处理Swing中的关键操作。 干净地closures对话框,发送一个窗口closures事件给它。

从我的博客 :

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

你可以使用下面的代码片段。 这是更好的,因为rootPane将从对话框中的任何组件获取事件。 如果需要,可以用dispose()replacesetVisible(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); } 

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

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

我在执行两个最佳答案时遇到问题。 下面是一个相当紧凑的版本,使用AbstractAction来自动实现Action的大部分方法,这些方法在基于文本的字段中工作(per @ 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); 

参考

这是我的,我添加控制+ Wclosuresshorcut以及

  KeyStroke esc = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE,0); Action closeAction = new AbstractAction(){ public void actionPerformed(ActionEvent e){ dispose(); } }; getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(esc, "closex"); getRootPane().getActionMap().put("closex", closeAction); KeyStroke ctrlW = KeyStroke.getKeyStroke("control W"); getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(ctrlW, "close"); getRootPane().getActionMap().put("close", closeAction);