我需要keylistener
始终“监听”要按下的转义键,然后退出程序。
我尝试在我的主构造函数中输入addKeyListener(this);
(绘制了面板的那个)并使用了
public void keyPressed( KeyEvent e)
{
int code = e.getKeyCode();
if(code == KeyEvent.VK_ESCAPE)
{
System.exit( 0 );
}
}
我没有错误,但按下转义键似乎没有做任何事情,有什么建议吗?
答案 0 :(得分:2)
Top-Level Container
默认情况下永远不会从KeyListener
接收KeyEvent
,但可能会出现一些代码行,错误的想法,错误的倾听者
JPanel
对KeyEvent
做出反应,但仅限于isFocusable
,FocusOwner
,错误的想法,错误的倾听者(例如)因为您需要以编程方式将Focus
从JTextField
移至JPanel
,错误的想法
将KeyBindings
添加到JFrame
/ JDialog
/ JWindow
,默认情况下可以Swing JComponent
访问,而不是AWT Components
答案 1 :(得分:1)
您可以使用InputMap / ActionMap机制:
Object escapeActionKey = new Object();
pnl.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("ESCAPE"), escapeActionKey);
pnl.getActionMap().put(escapeActionKey, new AbstractAction() {
public void actionPerformed(ActionEvent e) {
System.err.println("escape 1");
}
});
JComponent.WHEN_IN_FOCUSED_WINDOW
表示当pnl
组件位于焦点窗口时,此按键可用。
或者您也可以添加全局AWTEventListener侦听器:
Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
public void eventDispatched(AWTEvent event) {
if(event.getID() == KeyEvent.KEY_PRESSED) {
KeyEvent kEvent = (KeyEvent) event;
boolean isEsc = (kEvent.getKeyCode() == KeyEvent.VK_ESCAPE);
if(isEsc) {
System.err.println("escape 2");
}
}
}
}, AWTEvent.KEY_EVENT_MASK);
答案 2 :(得分:0)
在Swing中有一个顶层面板:GlassPane允许在顶层处理事件(以避免其他小部件参与事件)