2012-01-23 10 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

どのようにバインディングをフォーカスチャージとは独立してプログラムすることができますか?

getInputMap()メソッドを見てください。 3つの異なるInputMapがあります。祖先であるものが欲しいので、コンポーネントにフォーカスがない場合でも機能します。

0

私は、問題の考えを持っていますが、全くわかりません。

マウスボタンを押し下げると、マウスで作業が開始されます。ボタンを放すと、それはまだマウスで動いていて、その時点では常にリリースされ、マウスリリースの機能は常に実行されます。したがって、移動させるキーコマンドを実行すると、mouserelease関数はその動きを元に戻し、0にします。

mousedownというブール値を追加します。これは、押されたときにtrueに設定され、最後にfalseに設定されますリリース機能のmousedownブール値がtrueの場合にのみrelease関数を呼び出すように設定します。

0

getInputMap().put...の代わりにgetInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put...を試してください。この変更は私にとってはうまくいっていて、rootPaneに追加されたこれらのうちの1つは、フォーカスがどこにあっても動作します。

関連する問題