Почему умирают привязки клавиш?

Это приложение должно отправлять команду перемещения двигателя при нажатии кнопки графического интерфейса или клавиши со стрелкой и команду остановки двигателя при отпускании кнопки графического интерфейса или клавиши со стрелкой. Эти привязки отлично работают для стрелки вниз, пока не будет нажата соответствующая кнопка графического интерфейса. После нажатия кнопки 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);
}                                               

person jacknad    schedule 23.01.2012    source источник


Ответы (3)


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

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

person camickr    schedule 23.01.2012

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

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

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

person Citrus Rain    schedule 23.01.2012

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

person Eduardo Poço    schedule 15.12.2012