안녕하세요

프로그램 과정에서 막혔던 문제들에 대한 해결책 정리


페이지 목록

2011년 8월 15일 월요일

원할한 KeyListener 활용을 위한 Thread 도입

KeyListener를 사용하다 보면 몇 가지 불편한 점이 있다.

 그것은 여러 개의 키를 동시에 누를 경우 처리가 힘들 다는 점이다.

 이는 HashSet 등을 통해서도 해결할 수 있다. HashSet은 중복키를

 저장하지 않기에 여기에 Button Pressed 때 들어오는 Key값들을

 저장하면 된다. 그때 들어오는 키값을 저장하는 방법은

e.getKeyCode() or e.getKeyChar() 로 저장하면 된다. (이떄 e가

 KeyEvent를 뜻한다)

 저장 된 Key 값들을 Button released 때 set.remove(e.getKeyCode())

를 이용하여 삭제 하면 된다.

 저장 된 code들을 불러올 때에는

 while(set.hasNext())
{
       set.next() - 이 것을 부르면 key값이 불러진다.
}
 그러므로 여기서 불러진 값을 이용하여 자신이 원하는 Action을

 만들면 된다.

 예) set에 VM_UP , VM_DOWN 이 들어 있을 경우

while(set.hasNext())
{

  switch(set.next())
  case:VM_UP
 break;
 case : VM_DOWN
 break;

}


 를 이용하여 액션을 컨트롤 할 수 있다.

 이 경우 문제가 발생하였으니 그 문제는 바로

 오른쪽 화살표 누름 -> 오른쪽 + 위 화살표 누름 -> 위 화살표 땜

 이 때 이상하게 오른쪽 버튼은 눌러져 있는 상태이지만 더 이상

 Pressed Listener로 해당 액션이 전달되지 않았다.

 이유는 잘 알지 못하겠지만 먼저 누르고 있던 키보드 버튼 보다

 나중에 누른 키보드 버튼을 먼저 떼면 이 문제가 발생하였다.

 이를 해결하기 위한 보다 나은 방법은 바로 스레드를 도입하는 것이었다.

 Listener에서 Push 된 버튼을 boolean을 이용하여 조작할 수 있다.

 즉, Pressed 때 클릭된 버튼에 true를 주고, Released 때 false를 줌으로

 액션을 컨트롤 하는 것이다.

 그 후, 스레드를 이용해서 Button Pressed 일 때 즉, 해당 버튼에 대한

 boolean 값이 true 일 때 할 액션을 만들어 주면 성공이다.

 관련 소스)

Thread의 Runnable 소스


class CharMove implements Runnable {
public void run() {
while (true) {
Move();
}
}

public void Move() {
while (isUp == true || isDown == true || isLeft == true
|| isRight == true) {
if (isUp == true) {
cy -= 5;
cPanel.repaint();
System.out.println("UP ");
}
if (isDown == true) {
cy += 5;
cPanel.repaint();
System.out.println("Down ");
}
if (isLeft == true) {
cx -= 5;
cPanel.repaint();
System.out.println("LEFT ");
}
if (isRight == true) {
cx += 5;
cPanel.repaint();
System.out.println("Right ");
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}


}
}

Thread 작동 코드

CharMove charMove = new CharMove();
Thread cThread = new Thread(charMove);

cThread.start();

KeyListener에서 조작하고자 하는 버튼을 제어하는 코드

class ListenKey implements KeyListener {

@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
switch (e.getKeyCode()) {
case KeyEvent.VK_LEFT:
isLeft = true;
break;
case KeyEvent.VK_RIGHT:
isRight = true;
break;
case KeyEvent.VK_UP:
isUp = true;
break;
case KeyEvent.VK_DOWN:
isDown = true;
break;
}
}

@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
switch (e.getKeyCode()) {
case KeyEvent.VK_LEFT:
isLeft = false;
break;
case KeyEvent.VK_RIGHT:
isRight = false;
break;
case KeyEvent.VK_UP:
isUp = false;
break;
case KeyEvent.VK_DOWN:
isDown = false;
break;
}
}

@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
}




댓글 없음:

댓글 쓰기