2012-01-23 97 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中的工作集中在任何地方。