gpt4 book ai didi

java - Java JComponent 捕获鼠标事件,但未捕获按键事件

转载 作者:行者123 更新时间:2023-12-02 11:50:14 26 4
gpt4 key购买 nike

我正在开发一个名为 Lemmings 的旧游戏项目,Principle Game Panel 运行良好,接收 MouseEvents 但不接收 KeyEvents,这对我来说不太符合逻辑,所以我复制了该文件的代码你们看看发生了什么。

GamePanel 类扩展了 JComponent SWING 类

public class GameFrame {

private class GamePanel extends JComponent {

GamePanel(Dimension dim) {

setPreferredSize(dim);

//first version of the question was with the keyListner
/*addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
super.keyPressed(e);
System.out.println(e.getKeyCode());
//nothing show up
}
});*/

//I tried using this, but it didn't work
//getInputMap().put(KeyStroke.getKeyStroke("A"), "action");

// this works cause we use the right inputMap not the one by default
getInputMap(JComponent.WHEN_FOCUSED).put(KeyStroke.getKeyStroke("A"), "action");
getActionMap().put("action",new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("A is pressed");
//now it works
}
});

addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
super.mouseClicked(e);
System.out.println(e.getPoint());
}
});
setVisible(true);
}
}

private JFrame window;
private GamePanel panel;

public GameFrame() {
window = new JFrame("Test");
window.setLocationRelativeTo(null);
panel = new GamePanel(new Dimension(400, 400));
window.setContentPane(panel);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setVisible(true);
}

public static void main(String[] args) {
new GameFrame();
}
}

更新解决方案

  • 我了解到 JComponants 不可聚焦,因此它不会接收 KeyEvent,因此我们必须使用 Key Bindings 方法
  • 我发现每个 JComponent 都有 WHEN_IN_FOCUSED_WINDOW、WHEN_FOCUSED、WHEN_ANCESTOR_OF_FOCUSED_COMPONENT 引用的三个 inputMap,我们必须确保我们在工作中使用正确的 inputMap
  • 欲了解更多信息,请查看How to use key Bindings并检查方法 getInputMap()getInputMap(int)

最佳答案

按键事件仅分派(dispatch)到可聚焦组件。

默认情况下,JPanel 不可聚焦,因此它不会接收按键事件。

如果您尝试基于 KeyEvent 调用某种Action,那么您应该使用Key Bindings,而不是 KeyListener。即使组件没有焦点,键绑定(bind)也允许您监听 KeyStroke

阅读 Swing 教程中关于 How to Use Key Bindings 的部分了解更多信息和工作示例。

关于java - Java JComponent 捕获鼠标事件,但未捕获按键事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47928426/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com