使用Swing进行GUI开发。
我有一个自定义对话框,用于选择要在我的应用程序中打开的文件;它的类扩展javax.swing.JDialog
并包含JFileChooser
等JFileChooser
,可以切换显示或隐藏。
{{1}}组件本身已经处理了ESC键:当显示文件选择器(嵌入在我的对话框中)并按ESC时,文件选择器隐藏自己。
现在我希望我的对话框也能这样做:当我按下ESC时,我想要关闭对话框。请注意,当显示嵌入式文件选择器时,ESC键应该只隐藏它。
有什么想法吗?
答案 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)
使用InputMap
和ActionMap
来处理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')})