2013-05-19 2 views
1

KeyListeners가 가장 큰 장애물로 판명 될 때까지 KeyListener를 대다수 사용하고 있기 때문에 Key Bindings에 조금 익숙합니다. KeyBindings를 사용하여 keyReleased와 유사한 이벤트를 프로그래밍하는 방법에 대해 궁금합니다. KeyListeners는 keyPressed, keyTyped 및 keyReleased와 같은 쉬운 세 가지 방법을 제공했지만 Key Bindings를 사용하는 방법에 대해서는 약간 혼란 스럽습니다.Java에서 Key Binding을 사용하는 keyReleased() 메소드?

기본적으로 사용자가 위로를 누르면 개체가 위쪽으로 이동하기를 원합니다. 그러나 사용자가 UP을 놓으면 객체는 기본 중력을 시뮬레이트하기 위해 자동으로 아래쪽으로 이동해야합니다. UpAction 클래스를 보여주는 약간의 코드가 있습니다.

class UpAction extends AbstractAction 
{ 
    public void actionPerformed(ActionEvent tf) 
    { 
     north = true; 
     helitimer.start(); 
     helitimer.start(); 
     helitimer2.start(); 
     repaint(); 
    } 
} 

세 helitimers 연속적으로 원활하게 객체의 y 좌표를 증가하는 일련의 타이머를 시작 타이머 객체이다. upAction 동작이 호출되면 UpAction 클래스가 호출되고 객체를 이동하기 위해 세 개의 타이머가 시작됩니다.

어쨌든 사용자가 UP을 해제하면 조치가 더 이상 호출되지 않고 타이머가 중지됩니다.

고맙습니다.

+2

[예] (http://stackoverflow.com/a/14001011/230513). – trashgod

+1

여기에 하나 더 있습니다 [예] (http://stackoverflow.com/a/11534873/1057230) –

답변

3

것은 당신이 키 바인딩

당신이의 keyPressed 이벤트를 위해 할 정확히 같은 방식과의 keyReleased 같은 이벤트를 프로그램 얼마나 궁금하네요. 차이점은 KeyStroke에 있습니다. KeyStroke API의 read는, keyReleased 이벤트의 KeyStroke를 작성하는 방법을 나타내고 있습니다. KeyStroke를 어떻게 만들지에 따라 몇 가지 다른 방법이 있습니다.

KeyStroke 메서드는 keyPressed를 가정하므로 keyReleased 이벤트에 추가 매개 변수 또는 추가 키워드를 추가해야합니다. KeyStroke를 만들기 위해 어떤 방법을 사용하는지 알지 못하므로 정확한 변경 내용을 말할 수 없습니다. 자세한 내용은 API를 확인하십시오.

세 helitimers는 타이머 지속적으로 객체의 y 위치를 증가하는 타이머의 시리즈를 시작 객체와 원활

당신이 3 타이머를 필요가 없습니다 수 있습니다. 하나의 타이머가 만족스럽게 작동해야합니다.

어쨌든 내가 그것을 만들 수 있기 때문에 사용자가 UP을 풀면 조치가 더 이상 호출되지 않고 타이머가 중지됩니까?

keyPress 동작에서 타이머를 "시작할"수 있으면 keyReleasedAction에서 타이머를 "중지"할 수 있습니다. 필요한 것은 타이머에 대한 참조입니다. 게시 한 코드에 따라 타이머가 클래스 변수로 정의되어 있으므로 문제가되지 않습니다. 사용자가 UP을 놓을 때

그러나, 객체는이 작업을 수행하기 위해 다른 타이머가 필요합니다 같은

나에게 소리 기본적인 중력을 시뮬레이션하기 위해 자동으로 아래로 이동해야합니다.

또 다른 옵션은 항상 타이머를 실행하는 것입니다. 그런 다음 UP 키를 누르면 Y 증분이 음수 값이됩니다. UP 키를 놓으면 Y 증분 값이 양수 값이됩니다.

+0

감사합니다. API를 참조하겠습니다. 1 타이머가 객체에 필요한 속도를 제공하지 않는다는 것을 알았습니다. 그리고 y 변수의 증가를 증가 시키면 프로그램이 깜박입니다. – applemavs