그것은 여러 개의 키를 동시에 누를 경우 처리가 힘들 다는 점이다.
이는 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
}
}
댓글 없음:
댓글 쓰기