2014-10-07 3 views
1

분명히이 질문에 beforebeforebefore이 표시되지만 문제가 해결되지 않았거나 이해할 수없는 언어를 사용하고있는 것입니다.InputMap - 키 반복을 모니터링하지 않고 키를 모니터링하는 키 입력을 등록하십시오.

나는 JComponent.WHEN_IN_FOCUSED_WINDOW를 사용하여 키보드 액션을 등록해야하므로 KeyListener하지 대안입니다. 커서 키를 누른 상태에서 키를 눌렀다가 놓으면 추적해야합니다. 내장 된 키 반복으로 인해 여러 번 누르거나 발사 할 수 없습니다. 나는 키가 물리적으로 눌려지고 눌려지는 것을 정말로 알고 싶다. 예 : 누를 때 타이머를 시작하고이 출시되면 타이머를 중지합니다 (가상 키 반복으로 인해 타이머를 수십 번 시작하고 중지하지 마십시오).

나는 이것이 OS X에서 올바르게 작동했다고 믿지만, 지금은 Linux (OpenJDK 7)에있다.

어떻게?

답변

2

여러 사람들이 지적했듯이, 이것은 Linux에서 이상하게 보입니다 (또는 : 버그).

해결 방법은 다음과 같습니다. 프레스 액션 클래스가 ActionPress이고 릴리스 동작 클래스가 ActionRelease이라고 가정 해 보겠습니다.

  • 모두

    e.getWhenactionPerformed에 업데이트되는 long lastWhen을 유지한다. 그들은 공개 메소드 getLastWhen을 가지고 있습니다.
  • ActionRelease은 수 밀리 초를 사용하여 javax.swing.Timer을 유지합니다. 일반 actionPerformed은 타이머을 다시 시작합니다.
  • ActionPressactionPerformed은 해당 ActionReleasegetLastWhen을 호출합니다. 결과가 자신의 lastWhen과 동일하면 조치를 무시하고 리턴하십시오. 그렇지 않으면 조치를 수행하십시오.
  • ActionReleaseTimer에 대한 추가 ActionListener이 실제로 실행됩니다. 그 getLastWhen 구현에서, 그것은 lastWhen 반환하기 전에 타이머를 중지합니다.
+0

1. AWTEventListener에서 반환되는 whats, 반복 지연이 있습니다. 이것은 Native OS에서 /에서 설정하는 일부입니다. 2. 스윙 타이머가 무언가를 해결하지 못합니다. – mKorbel

+0

@mKorbel - 타이머는 릴리스 이벤트를 건너 뛰기 위해서만 필요합니다. 반복의 일부입니다. 이 경우 _same time stamp_ 키를 누른 다음 릴리스가옵니다. 따라서 적어도 1 밀리 초의 지연이있는 한이 방법이 효과적이므로 OS의 주요 반복 속도가 실제로 무엇인지는 중요하지 않습니다. 중요한 것은 'ActionPress'가 먼저 출시되어 이전 출시 이벤트를 '무효화'할 수 있다는 것입니다. –