2012-01-23 40 views
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); 

GUI按钮

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

回答

3

绑定如何被编程为独立于焦点chages?

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

0

我有一个问题的想法,但不能完全肯定。

当你按下鼠标按钮时,它开始使用鼠标工作。当你释放按钮时,它仍然在使用鼠标,并且始终释放该按钮,并始终执行鼠标释放功能。因此,当它执行使其移动的关键命令时,mouserelease函数将撤消移动 - 使其成为0.

添加一个名为mousedown的布尔值,它在按下时设置为true,并在最后设置为false的释放功能。将其设置为只在mousedown布尔值为true时才调用释放函数。

0

尝试getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put...而不是getInputMap().put...。这种改变对我来说很有用,其中一个增加在rootPane中的工作集中在任何地方。

相关问题