JPanel 对事件的反应非常奇怪。它可以处理 MouseEvent,但不会处理 KeyEvent。
JPanel 类:
public class DrawPanel extends JPanel {
class DrawListener extends MouseAdapter implements KeyListener {
@Override
public void mouseDragged(MouseEvent e) {
// works fine
}
@Override
public void mouseReleased(MouseEvent e) {
// works fine
}
@Override
public void mouseClicked(MouseEvent e) {
// works fine
}
@Override
public void keyPressed(KeyEvent e) {
// Listener is NOT invoked here if anykey is pressed
}
@Override
public void keyReleased(KeyEvent e) {
// NOT invoked
}
@Override
public void keyTyped(KeyEvent e) {
// NOT invoked
}
面板构造函数:
// Class constructor
public DrawPanel() {
DrawListener l = new DrawListener();
addMouseListener(l);
addMouseMotionListener(l);
addKeyListener(l);
setFocusable(true);
requestFocus();
}
如果鼠标事件处理程序工作正常,这怎么可能?哪里可能出错?
KeyListener
只有在注册到的组件可聚焦且具有键盘焦点时才会响应关键事件。
这是 KeyListener
的已知问题。
最佳选择是使用键绑定 API,该 API 允许您控制关键事件将发生的焦点级别。