摇摆:如何按ESC键时closures对话框?
用Swing开发GUI。
我有一个自定义对话框来select要在我的应用程序中打开的文件; 它的类扩展了javax.swing.JDialog
并且在其他组件中包含了一个JFileChooser
,可以切换为显示或隐藏。
JFileChooser
组件已经自己处理了ESC键:当文件select器显示出来(embedded在我的对话框中),然后按下ESC键,文件select器自动隐藏起来。
现在我想让我的对话框做同样的事情:当我按ESC时,我想closures对话框。 请注意,在显示embedded式文件select器时,ESC键应该只隐藏它。
有任何想法吗 ?
使用InputMap
和ActionMap
来处理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);