2

此应用程序需要在按下 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);
}                                               
4

3 回答 3

3

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

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

于 2012-01-23T15:56:50.680 回答
0

我对这个问题有一个想法,但并不完全确定。

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

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

于 2012-01-23T15:45:31.477 回答
0

尝试getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put...而不是getInputMap().put.... 此更改对我有用,并且在 rootPane 中添加的其中一个在焦点所在的地方都有效。

于 2012-12-15T21:35:30.713 回答