用Swing进行GUI开发。
我有一个自定义对话框,用于选择要在应用程序中打开的文件;它的类扩展了javax.swing.JDialog
,并在其他组件中包含一个JFileChooser
,可以切换为显示或隐藏。
JFileChooser
组件本身已经处理了ESC键:当文件选择器显示时(嵌入在我的对话框中),我按了ESC键,文件选择器就会隐藏起来。
现在我想让我的对话框做同样的事情:当我按ESC键时,我想关闭对话框。请注意,当嵌入式文件选择器显示时,ESC键应该只隐藏它。
有什么想法吗?
发布于 2009-03-13 14:21:02
使用InputMap
和ActionMap
来处理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
);
}
发布于 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);
}
发布于 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);
https://stackoverflow.com/questions/642925
复制相似问题