【问题标题】:Why do key bindings die?为什么键绑定会死?
【发布时间】:2012-01-23 15:03:13
【问题描述】:

此应用程序需要在按下 GUI 按钮箭头键时发送电机移动命令,并在按下 GUI 按钮 箭头键时发送电机停止命令释放。 在按下相应的 GUI 按钮之前,这些绑定适用于向下箭头。 按下 GUI 按钮后,箭头键将被忽略。 如果是焦点更改杀死了绑定,那么如何将绑定编程为独立于焦点更改? 如果不是,真正的问题是什么?如何修复?

键绑定

Action tiltStop = new AbstractAction() {
    public void actionPerformed(ActionEvent e) {
        MotorStop(TILT_AXIS);
    }
};
mainPanel.getInputMap().put(KeyStroke
    .getKeyStroke(KeyEvent.VK_DOWN, 0, true), "tiltStop");
mainPanel.getActionMap().put("tiltStop", tiltStop);
Action tiltDown = new AbstractAction() {
    public void actionPerformed(ActionEvent e) {
        MotorMove(TILT_AXIS, NEGATIVE_DIR);
    }
};
mainPanel.getInputMap().put(KeyStroke
    .getKeyStroke(KeyEvent.VK_DOWN, 0, false), "tiltDown");
mainPanel.getActionMap().put("tiltDown", tiltDown);

图形界面按钮

private void jButtonAxisDownMousePressed(java.awt.event.MouseEvent evt) {
    MotorMove(TILT_AXIS, NEGATIVE_DIR);
}                                              
private void jButtonAxisDownMouseReleased(java.awt.event.MouseEvent evt) {
    MotorStop(TILT_AXIS);
}                                               

【问题讨论】:

    标签: java swing netbeans-6.9 key-bindings key-events


    【解决方案1】:

    如何将绑定编程为独立于焦点变化?

    查看 getInputMap() 方法。有 3 种不同的 InputMap。你想要一个祖先,这样即使组件没有焦点它也能工作。

    【讨论】:

      【解决方案2】:

      我知道这个问题,但不完全确定。

      当您按下鼠标按钮时,它开始使用鼠标。当您释放按钮时,它仍在使用鼠标,并且始终在该点释放,并且始终执行鼠标释放的功能。因此,当它执行使其移动的键盘命令时,mouserelease 功能正在撤消移动 - 使其变为 0。

      添加一个名为 mousedown 的布尔值,当它被按下时设置为 true,并在释放函数结束时设置为 false。将其设置为仅在 mousedown 布尔值为 true 时调用释放函数。

      【讨论】:

        【解决方案3】:

        尝试 getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put... 而不是 getInputMap().put... 。此更改对我有用,并且在 rootPane 中添加的其中一个可以在焦点所在的任何位置工作。

        【讨论】:

          猜你喜欢
          • 2023-03-08
          • 2012-04-19
          • 2015-07-22
          • 2015-06-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-21
          • 2015-10-18
          相关资源
          最近更新 更多