본문 바로가기

프로그램언어/자바

이벤트 리스너 예제2

KeyEvent와 KeyListener

컴포넌트에 키 이벤트 리스너를 등록하기 위해서는 다음과 같이 addKeyListener()메소드를 이용한다.

component.addKeyListener(myKeyListener)
Key 이벤트가 발생하는 경우 KeyListener의 메소드 리스너
키를 누르는 순간 void keyPressed(KeyEvent e) KeyListener
누른 키를 떼는 순간 void keyReleased(KeyEvent e) KeyListener
누른 키를 떼는 순간
(유니코드 키 경우에만 적용)
void keyTyped(KeyEvent e) KeyListener

 

입력된 키 판별

키 이벤트가 발생하면 입력된 키 정보가 KeyEvent 객체에 담겨져 리스너에게 전달된다. KeyEvent 객체의 다음 2개의 메소드를 입력된 키를 판별할 수 있다.

char KeyEvent.getKeyChar() : 입력된 키의 문자코를 리턴

int KeyEvent.getKeyCode() :  입력된 키에 대한 코드 값(정수형)을 리턴

 

키를 판별하기 위해서는 반드시 getKeyCode()가 리턴한 키 코드와 가상 키값을 비교해야 한다.

가상 키 설명 가상키 설명
VK_0~VK_9 0부터 9까지의 키, '0' ~ '9' 유니코드 VK_LEFT 왼쪽 방향 키
VK_A~VK_Z A부터 Z까지의 키, 'A' ~ 'Z' 유니코드 VK_RIGTH 오른쪽 방향 키
VK_F1~VK_F24 F1 ~ F24까지의 키 코드 VK_UP Up 키
VK_HOME Home 키 VK_DOWN Down 키
VK_END End 키 VK_CONTROL Control 키
VK_PGUP Page Up 키 VK_SHIFT Shift 키
VK_PGDN Page Down키 VK_ALT Alt 키
VK_UNDEFINED 입력된 키의 코드 값을 알 수 없음 VK_TAB Tab 키

 

입력된 키의 키코드, 유니코드, 키의 이름 문자열을 출력해보자.

import javax.swing.*;

import java.awt.event.*;

import java.awt.*;

 

public class KeyListenerEx extends JFrame {

    private JLabel [] keyMessage;              // 3개의 메시지를 출력할 레이블 컴포넌트 배열

 

    public KeyListenerEx() {

        setTitle("keyListener 예제");

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

 

        Container c = getContentPane();

        c.setLayout(new FlowLayout());

        c.addKeyListener(new MyKeyListener());

 

        // 레이블 배열을 3개 생성하고 각 레이블 컴포넌트 생성

        keyMessage = new JLabel [3];        // 레이블 배열 생성

        keyMessage[0] = new JLabel(" 키 코드 ");

        keyMessage[1] = new JLabel(" 키 문자 ");

        keyMessage[2] = new JLabel(" 키 텍스트 ");

 

        // 3개의 레이블 컴포넌트를 컨텐트팬에 부착

        for(int i=0; i<keyMessage.length; i++) {

            c.add(keyMessage[i]);

            keyMessage[i].setOpaque(true);                     // 배경색이 보이록 불투명 속성 설정

            keyMessage[i].setBackground(Color.YELLOW);   // 배경색을 CYAN 색으로 변경

        }

 

        setSize(300,150);

        setVisible(true);

 

        // 컨텐트팬이 키 입력을 받을 수 있도록 포커스 강제 지정

        c.setFocusable(true);

        c.requestFocus();

    }

 

    // Key 리스너 구현

    class MyKeyListener extends KeyAdapter {

        public void keyPressed(KeyEvent e) {

            int keyCode = e.getKeyCode();               // 키 코드 알아내기

            char keyChar = e.getKeyChar();              // 키 문자 값 알아내기

            keyMessage[0].setText(Integer.toString(keyCode));         // 키 코드 출력

            keyMessage[1].setText(Character.toString(keyChar));      // 키 문자 출력

            keyMessage[2].setText(KeyEvent.getKeyText(keyCode));  // 키 이름 문자열 출력

            System.out.println("KeyPressed");       // 콘솔창에 메소드 이름 출력

        }

        public void keyReleased(KeyEvent e) {

            System.out.println("KeyReleased");     // 콘솔창에 메소드 이름 출력

        }

        public void keyTyped(KeyEvent e) {

            System.out.println("KeyTyped");        // 콘솔창에 메소드 이름 출력

        }

    }

 

    public static void main(String [] args) {

        new KeyListenerEx();

    }

}

실행 결과]

 

'F1' 키를 입력받으면 컨텐트팬의 배경색을 녹색으로 변경하고, '5' 키를 입력하면 노란색으로 변경하는 프로그램을 작성하시오.

import javax.swing.*;

import java.awt.event.*;

import java.awt.*;

 

public class KeyCodeEx extends JFrame {

    private JLabel la = new JLabel(); // 빈 레이블 컴포넌트 생성

 

    public KeyCodeEx() {

        setTitle("Key Code 예제 : F1키:초록색, % 키 노란색");

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

 

       Container c = getContentPane();

       c.addKeyListener(new MyKeyListener());

       c.add(la);

       setSize(300,150);

       setVisible(true);

 

       // 컨텐트팬이 키 입력을 받을 수 있도록 포커스 강제 지정

       c.setFocusable(true);

       c.requestFocus();

    }

 

    // Key 리스너 구현

    class MyKeyListener extends KeyAdapter {

        public void keyPressed(KeyEvent e) {

            Container contentPane = (Container)e.getSource();

 

            // la에 입력된 키의 키 이름 문자열을 출력하여 사용자에게 보고함

            la.setText(KeyEvent.getKeyText(e.getKeyCode())+"키가 입력되었음");

 

            if(e.getKeyChar() == '%') // 입력된 키가 % 인 경우

                contentPane.setBackground(Color.YELLOW);

            else if(e.getKeyCode() == KeyEvent.VK_F1) // 입력된 키가 <F1> 인가

                contentPane.setBackground(Color.GREEN);

        }

    }

 

    public static void main(String [] args) {

        new KeyCodeEx();

    }

}

실행 결과]

 

 

키보드의 방향키를 눌려 "Hello" 문자열을 움직여보자. ( 실행시 x좌표 50, y좌표 50을 초기값으로 설정 )

import javax.swing.*;

import java.awt.event.*;

import java.awt.*;

 

public class FlyingTextEx extends JFrame {

    private final int FLYING_UNIT = 10; // 레이블이 한 번 움직이는 단위는 10픽셀

    private JLabel la = new JLabel("HELLO"); // 키 입력에 따라 움직일 레이블 컴포넌트

 

    public FlyingTextEx() {

        setTitle("상,하,좌,우 키를 이용하여 텍스트 움직이기");

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

 

        Container c = getContentPane();

        c.setLayout(null); // 컨텐트팬의 배치관리자 삭제

        c.addKeyListener(new MyKeyListener()); // 컨텐트팬에 Key 리스너 달기

        la.setLocation(50,50); // la의 초기 위치는 (50,50)

        la.setSize(100,20);

        c.add(la);

 

        setSize(300,300);

        setVisible(true);

 

        c.setFocusable(true);

        c.requestFocus(); //컨텐트팬이 키 입력을 받을 수 있도록 포커스 강제 지정

 

         // 다음 코드는 컨텐트팬에 포커스를 잃은 경우 마우스를 클릭하면 다시 포커스를 얻게 함

        c.addMouseListener(new MouseAdapter() {

            public void mouseClicked(MouseEvent e) {

                Component c = (Component)e.getSource(); // 마우스가 클릭된 컴포넌트

                c.setFocusable(true);

                c.requestFocus(); // 컴포넌트에게 포커스 설정

            }

        });

    }

 

    // Key 리스너 구현

    class MyKeyListener extends KeyAdapter {

        public void keyPressed(KeyEvent e) {

            int keyCode = e.getKeyCode(); // 입력된 키의 키코드를 알아낸다.

 

            // 키 코드 값(keyCode)에 따라 상,하,좌,우 키를 판별하고 la의 위치를 이동시킨다.

            switch(keyCode) {

            case KeyEvent.VK_UP: // UP 키

                la.setLocation(la.getX(), la.getY()-FLYING_UNIT); break;

            case KeyEvent.VK_DOWN: // DOWN 키

                la.setLocation(la.getX(), la.getY()+FLYING_UNIT); break;

            case KeyEvent.VK_LEFT: // LEFT 키

                la.setLocation(la.getX()-FLYING_UNIT, la.getY()); break;

            case KeyEvent.VK_RIGHT: // RIGHT 키

                la.setLocation(la.getX()+FLYING_UNIT, la.getY()); break;

            }

        }

    }

 

    public static void main(String [] args) {

        new FlyingTextEx();

    }

}

실행 결과]

'프로그램언어 > 자바' 카테고리의 다른 글

스윙 컴포넌트의 공통 메소드1  (0) 2020.11.04
이벤트 리스너 예제3  (0) 2020.11.04
이벤트 리스너 예제1  (0) 2020.11.03
이벤트 처리하기  (0) 2020.11.02
GUI문제1  (0) 2020.11.02