Почему привязки клавиш умирают? - PullRequest
2 голосов
/ 23 января 2012

Это приложение должно отправлять команду перемещения двигателя, когда кнопка 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);
}                                               

Ответы [ 3 ]

3 голосов
/ 23 января 2012

как можно запрограммировать привязки, чтобы они не зависели от фокусировки?

Посмотрите на метод getInputMap (). Есть 3 разных InputMaps. Вам нужен тот, который является предком, чтобы он работал, даже если у компонента нет фокуса.

0 голосов
/ 16 декабря 2012

попробуйте getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put... вместо getInputMap().put....Это изменение сработало для меня, и одно из них, добавленное в rootPane, работает везде, где есть фокус.

0 голосов
/ 23 января 2012

Я имею представление о проблеме, но не совсем уверен.

Когда вы нажимаете кнопку мыши, она начинает работать с мышью. Когда вы отпускаете кнопку, она все еще работает с мышью, и она всегда отпускается в этот момент, и всегда выполняет функцию для отпускания мыши. Поэтому, когда она выполняет ключевую команду, которая заставляет его двигаться, функция освобождения мыши отменяет движения, делая ее равной 0.

Добавьте логическое имя mousedown, для которого устанавливается значение true при нажатии, и устанавливается значение false в конце функции освобождения. Установите его так, чтобы он вызывал функцию release только тогда, когда значение mousedown boolean равно true.

...