프로그래밍[Univ]/Swing Basic

[Swing] KeyEvent / KeyListener

Cloud Travel 2011. 9. 14. 23:12
1. KeyEvent 와 Focus / 키 이벤트와 포커스

 - 모든 컴포넌트는 Key이벤트를 받을 수 있다.
 - 여러 컴포넌트가 동시에 Key입력을 받으면 혼잡해지고, 화면을 제어하기가 힘들어진다.
   (일반적으로 우리가 사용하고 있는 모든 것을 보아라...)
  > 여기서 나온것이 Focus!! Key입력은 Focus를 받고 있는 것만이 가능하다.
 - 즉, Focus를 받는것이 Key이벤트를 독점한다!!


2. Focus 주기

 - 강제로 임의의 컴포넌트에 포커스를 주는 방법
  > component.requsetFocus(); // component 컴포넌트에 포커스를 강제로 줌...
 - 컴포넌트가 포커스를 받을수 있는 상태로 대기
  > component.setFoucsable(true); // component 포커스 받는 것을 대기


3. KeyEvent와 KeyListener

 - 키를 입력하는 것에 의해 컴퓨터는 3가지 경우에 대해서 반응을 한다.
  ⓐ 키를 누르는 순간 : keyPressed();
  ⓑ 키를 때는 순간 : keyReleased();
  ⓒ 키를 때는 순간(유니코드 키(문자키)인경우 한번더 발생) : keyTyped();
   > 유니코드에 등록된 키만이 keyTyped리스너에 대해서 발생한다.
 - 컴포넌트에 키 이벤트 리스너 등록
  > component.addKeyListener(myKeyListener);
 

4. 입력된 키 판별

 입력된 키를 판별하기위해 두개의 메소드를 제공한다.
 - char KeyEvent.getKeyChar(); // : 입력된 유니코드의 값을 리턴해준다.
 - int KeyEvent.getKeyCode(); // : 유니코드를 포함한 모든키에 대해 정수형의 키코드를 리턴해준다.
   (자바에선 가상키 값(Virtual Key)으로 VK_로 시작하는 static상수로 지정되있다)
   ex) VK_0 : 0키 / VK_HOME : Home 키 / VK_UP : ↑키 ... 등등

------------------------------------------------------------------------------------------------------
키 이벤트를 사용한 간단한 프로그램으로 →←↑↓ 키를 이용하여 문자열을 이동시키는 프로그램을 소개하면서
간단히 주석을 달아보겠다.
소스는 총 5개로 구성되있다. MainDrive, MyFrame, MyKeyListener, MyLabel, MyPanel
메인소스부터 보겠다.

MainDrive.java

public class MainDrive {
 
 public static void main(String[]args){
  new MyFrame();
 }
}

설명할게 없다... MyFrame을 소환하는 것으로 프로그램을 돌려주는 역할을한다..

MyFrame.java

import java.awt.*;
import javax.swing.*;
public class MyFrame extends JFrame{
 
 MyFrame(){
  setTitle("Key Listener Test");
  setSize(300,400);
  setVisible(true);
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  setContentPane(new MyPanel()); //컨텐트 팬으로 MyPanel를 사용한다.
  
  // 컨텐트 팬을 얻은 후 키 입력을 받을 수 있게 강제 지정해준다.
  Container ct = getContentPane();  
  ct.requestFocus();
 }
}

이전에 설명한 것은 설명하지 않는다. 주석이외 추가 설명은 없다.
그럼 다음으로는 MyPanel.java를 살펴보도록하자.

MyPanel.java

import javax.swing.*;

//MyPanel은 JFrame에서 컨텐트펜으로 사용하기위해 만들어졌다.
public class MyPanel extends JPanel{
 
 static MyLabel lb = new MyLabel();
 //이동할 라벨을 생성해 줌. 라벨을 다른 클래스에서도 사용가능하게 static 지정을 해줌

 MyPanel(){
  setLayout(null);  // 레이아웃을 삭제, 라벨의 이동이 가능하게 하기 위해서...
  KeyListener(new MyKeyListener()); // Key리스너를 컨텐트 펜에 달음
  add(lb);  // 컨텐트 펜에 라벨을 달음
 }
}

여기도 주석이외에는... 다음으로는 메인 다음으로 간단한 MyLabel.java를 보도록하자.

MyLabel.java

import javax.swing.JLabel;

public class MyLabel extends JLabel {
 
 MyLabel(){
  setText("hellow");
  setSize(100,20);
  setLocation(100,50);
 }
}

별거 없다... 왜 이딴거 만들었냐고 하는 사람도 있겠지만 나중에 설명하겠다.
마지막으로 오늘의 주제였단 키이벤트리스너인 MyKeyListener.java를 보도록하겠다.

MyKeyListener.java

import java.awt.event.*;

public class MyKeyListener implements KeyListener {
 
 // 키 입력으로 인해서 이동하는 간격
 private final int UNIT = 10;

 public void keyPressed(KeyEvent e) {
  int keyCode = e.getKeyCode();
  
  //키코드를 사용하는 이유 : 상,하,좌,우 키 모두 유니코드가 아니기 때문!!
  switch(keyCode){
   case KeyEvent.VK_UP :
    MyPanel.lb.setLocation(MyPanel.lb.getX(),MyPanel.lb.getY()-UNIT);
    break;
   case KeyEvent.VK_DOWN :
    MyPanel.lb.setLocation(MyPanel.lb.getX(),MyPanel.lb.getY()+UNIT);
    break;
   case KeyEvent.VK_LEFT :
    MyPanel.lb.setLocation(MyPanel.lb.getX()-UNIT,MyPanel.lb.getY());
    break;
   case KeyEvent.VK_RIGHT :
    MyPanel.lb.setLocation(MyPanel.lb.getX()+UNIT,MyPanel.lb.getY());
    break;
  }
 }

 public void keyReleased(KeyEvent e) { }
 
 public void keyTyped(KeyEvent e) { }

}

주로 볼곳은 색칠되있는거겠지만... 역시 설명할만한건 없다.
단지 상하좌우키가 유니코드가 아니기 때문에 키코드를 사용하는게 유리하다는 것...
만일 유니코드와 유니코드가 아닌 키가 섞여서 사용되도 똑같을 것이다...
하지만 유니코드로만 되있다면 키코드가아닌 키차를 사용하는게 좋을 것이겠다.
아무거나 사용해도 관계는 없지만...;;

-----------------------------------------------------------------------------------

스윙을 공부하면서 무지 화나는 부분이 많다.

지금까지 본 모든 책을 봐도 JFrame에 모든 것을 다 구현한다.
이는 재사용 및 수정에 불리하고 객체지향의 의미마져 떨어뜨린다.
위의 예에서 MyLabel정도의 클래스는 솔직히 작고도 작기 때문에 따로 안해도되지만
그런 버릇이 들면 안될것같기에 나는 모든 것을 클래스로 구현해서 만든다.
지금 위의 소스에서 아직 걸리는게 MyLabel을 static으로 지정한 것이다...
누군가 이방법이외의 것을 안다면 댓글로 좀 알려달라...
나의 레벨은 아직 99기준 한자리수 의 랩밖에 안되기때문에... 배움을 원한다-ㅅ-;

이는 바로!!! 책을봐서 이론공부를 하고 코드 짤때 혼자 고민해야 된다는 것이다 ㅠㅠ

해법은 존재하지 않지만 참고할만한게 적다는 것이다...

므튼 자바설명하면서 객체지향을 추구하다가 스윙부분을 설명하면서 부터 이점이 떨어지는 책들이 원망스럽다.

므튼 키 리스너 를 작성하면서 투덜글을 쓰며 오늘의 공부를 마친다-_-;