2012-01-23 7 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 разных InputMaps. Вам нужен тот, который является предком, поэтому он будет работать, даже если компонент не имеет фокуса.

0

У меня есть представление о проблеме, но не совсем уверен.

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

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

0

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

Смежные вопросы