News Download Tutorial FAQ Reference Buy

자바 언어 : 키보드 이벤트

오리걸음 경주
오리걸음 경주는 뒤뚱뒤뚱 달려가서 누가 먼저 목표 지점에 도착하는지 시합하는 경주입니다. 뒤뚱뒤뚱 달려가는 동작을 만들어야겠습니다. 왼쪽 바퀴를 중심으로 왼쪽으로 회전하다가 오른쪽 바퀴를 중심으로 오른쪽으로 회전하는 것을 반복하면 뒤뚱뒤뚱 앞으로 달려가게 됩니다.

방향을 바꾸는 명령은 어떻게 전달하면 좋을까요? 방향을 자주 바꾸어야 하기 때문에 컴퓨터 키보드의 스페이스 키를 눌러 명령하도록 해봅시다.

아래의 코드에서 키보드 이벤트는 실행 창이 활성화되어 있을 때에만 얻을 수 있습니다. 코드를 실행하면 다음 그림과 같이 실행 창이 나타나면서 활성화되지만 혹시 활성화되어 있지 않은 경우에는 실행 창을 마우스로 클릭하면 활성화됩니다.

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;

import org.roboid.hamster.Hamster;

@SuppressWarnings("serial")
public class Controller extends JFrame {
    private final Hamster hamster = new Hamster();
    private boolean left;

    public void run() {
        setSize(100, 100);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);

        addKeyListener(new KeyAdapter() {
            // 키보드의 키를 누르면 호출된다.
            @Override
            public void keyPressed(KeyEvent event) {
                if(event.getKeyChar() == ' ') { // 스페이스 키를 눌렀으면
                    left = !left; // 방향을 반대로 한다.

                    if(left) { // 왼쪽 방향이면
                        hamster.wheels(0, 50);
                    } else {
                        hamster.wheels(50, 0); // 오른쪽 방향이면
                    }
                }
            }
        });
    }

    public static void main(String[] args) {
        new Controller().run();
    }
}

출발선을 그리고, 목표 지점에도 선을 그립니다. 친구와 함께 오리걸음 경주를 해보도록 합시다.

경주를 좀 더 재미있게 하려면 다음 그림과 같이 종이컵을 세워 놓고 종이컵을 돌아서 다시 출발선으로 돌아오는 경주를 하여도 좋습니다.

햄스터 조종기
키보드의 방향 키를 사용하여 햄스터 조종기를 만들어 봅시다. 위쪽 방향 키는 앞으로 이동, 아래쪽 방향 키는 뒤로 이동, 왼쪽 방향 키는 왼쪽으로 회전, 오른쪽 방향 키는 오른쪽으로 회전하도록 하고, 스페이스 키를 누르면 정지하도록 합시다. 키보드의 방향 키는 특수 키이기 때문에 getKeyCode() 메소드로 확인해야 합니다.

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;

import org.roboid.hamster.Hamster;

@SuppressWarnings("serial")
public class Controller extends JFrame {
    private final Hamster hamster = new Hamster();

    public void run() {
        setSize(100, 100);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);

        addKeyListener(new KeyAdapter() {
            // 키보드의 키를 누르면 호출된다.
            @Override
            public void keyPressed(KeyEvent event) {
                int keyCode = event.getKeyCode();
                if(keyCode == KeyEvent.VK_SPACE) { // 스페이스 키를 눌렀으면
                    hamster.stop(); // 정지한다.
                } else if(keyCode == KeyEvent.VK_UP) { // 위쪽 방향 키
                    hamster.wheels(30); // 앞으로 이동한다.
                } else if(keyCode == KeyEvent.VK_DOWN) { // 아래쪽 방향 키
                    hamster.wheels(-30); // 뒤로 이동한다.
                } else if(keyCode == KeyEvent.VK_LEFT) { // 왼쪽 방향 키
                    hamster.wheels(-30, 30); // 왼쪽으로 회전한다.
                } else if(keyCode == KeyEvent.VK_RIGHT) { // 오른쪽 방향 키
                    hamster.wheels(30, -30); // 오른쪽으로 회전한다.
                }
            }
        });
    }

    public static void main(String[] args) {
        new Controller().run();
    }
}

축구 경기장을 만들고 친구와 함께 축구 경기를 해봅시다.
햄스터 피아노
키보드의 알파벳 키를 사용하여 피아노를 만들어 봅시다. 키보드의 a, s, d, f, g, h, j, k, l, ;, ' 키를 순서대로 도, 레, 미, 파, 솔, 라, 시, 도, 레, 미, 파 음으로 하고, 스페이스 키를 누르면 소리를 끄도록 합시다. 작은 따옴표(') 키의 경우에는 작은 따옴표로 감쌀 수 없기 때문에 역 슬래시( \ )를 사용하였음에 주의하세요.

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;

import org.roboid.hamster.Hamster;

@SuppressWarnings("serial")
public class Controller extends JFrame {
    private final Hamster hamster = new Hamster();

    public void run() {
        setSize(100, 100);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);

        addKeyListener(new KeyAdapter() {
            // 키보드의 키를 누르면 호출된다.
            @Override
            public void keyPressed(KeyEvent event) {
                char key = event.getKeyChar();
                if(key == ' ') { // 스페이스 키를 눌렀으면
                    hamster.note(0); // 소리를 끈다.
                } else if(key == 'a') {
                    hamster.note(Hamster.NOTE_C_4); // 도
                } else if(key == 's') {
                    hamster.note(Hamster.NOTE_D_4); // 레
                } else if(key == 'd') {
                    hamster.note(Hamster.NOTE_E_4); // 미
                } else if(key == 'f') {
                    hamster.note(Hamster.NOTE_F_4); // 파
                } else if(key == 'g') {
                    hamster.note(Hamster.NOTE_G_4); // 솔
                } else if(key == 'h') {
                    hamster.note(Hamster.NOTE_A_4); // 라
                } else if(key == 'j') {
                    hamster.note(Hamster.NOTE_B_4); // 시
                } else if(key == 'k') {
                    hamster.note(Hamster.NOTE_C_5); // 도
                } else if(key == 'l') {
                    hamster.note(Hamster.NOTE_D_5); // 레
                } else if(key == ';') {
                    hamster.note(Hamster.NOTE_E_5); // 미
                } else if(key == '\'') {
                    hamster.note(Hamster.NOTE_F_5); // 파
                }
            }
        });
    }

    public static void main(String[] args) {
        new Controller().run();
    }
}

두 가지를 수정해 봅시다. 첫째, 조건문이 너무 많습니다. switch 문을 사용해 봅시다. 둘째, 같은 키를 두 번 누르면 음이 연결되어 구분이 안 됩니다. 음을 연주하기 전에 잠깐 쉬어주도록 합시다.

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;

import org.roboid.hamster.Hamster;

@SuppressWarnings("serial")
public class Controller extends JFrame {
    private final Hamster hamster = new Hamster();

    public void run() {
        setSize(100, 100);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);

        addKeyListener(new KeyAdapter() {
            // 키보드의 키를 누르면 호출된다.
            @Override
            public void keyPressed(KeyEvent event) {
                switch(event.getKeyChar()) {
                    case ' ': hamster.note(0); break; // 스페이스 키를 눌렀으면 소리를 끈다.
                    case 'a': hamster.note(0, 0.05); hamster.note(Hamster.NOTE_C_4); break; // 도
                    case 's': hamster.note(0, 0.05); hamster.note(Hamster.NOTE_D_4); break; // 레
                    case 'd': hamster.note(0, 0.05); hamster.note(Hamster.NOTE_E_4); break; // 미
                    case 'f': hamster.note(0, 0.05); hamster.note(Hamster.NOTE_F_4); break; // 파
                    case 'g': hamster.note(0, 0.05); hamster.note(Hamster.NOTE_G_4); break; // 솔
                    case 'h': hamster.note(0, 0.05); hamster.note(Hamster.NOTE_A_4); break; // 라
                    case 'j': hamster.note(0, 0.05); hamster.note(Hamster.NOTE_B_4); break; // 시
                    case 'k': hamster.note(0, 0.05); hamster.note(Hamster.NOTE_C_5); break; // 도
                    case 'l': hamster.note(0, 0.05); hamster.note(Hamster.NOTE_D_5); break; // 레
                    case ';': hamster.note(0, 0.05); hamster.note(Hamster.NOTE_E_5); break; // 미
                    case '\'': hamster.note(0, 0.05); hamster.note(Hamster.NOTE_F_5); break; // 파
                }
            }
        });
    }

    public static void main(String[] args) {
        new Controller().run();
    }
}

공통적인 부분을 메소드로 만들면 다음과 같이 좀 더 간략하게 코드를 작성할 수 있습니다.

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;

import org.roboid.hamster.Hamster;

@SuppressWarnings("serial")
public class Controller extends JFrame {
    private final Hamster hamster = new Hamster();

    private void play(int pitch) {
        hamster.note(0, 0.05); // 0.05 박자로 잠시 쉰다.
        hamster.note(pitch);
    }

    public void run() {
        setSize(100, 100);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);

        addKeyListener(new KeyAdapter() {
            // 키보드의 키를 누르면 호출된다.
            @Override
            public void keyPressed(KeyEvent event) {
                switch(event.getKeyChar()) {
                    case ' ': hamster.note(0); break; // 스페이스 키를 눌렀으면 소리를 끈다.
                    case 'a': play(Hamster.NOTE_C_4); break; // 도
                    case 's': play(Hamster.NOTE_D_4); break; // 레
                    case 'd': play(Hamster.NOTE_E_4); break; // 미
                    case 'f': play(Hamster.NOTE_F_4); break; // 파
                    case 'g': play(Hamster.NOTE_G_4); break; // 솔
                    case 'h': play(Hamster.NOTE_A_4); break; // 라
                    case 'j': play(Hamster.NOTE_B_4); break; // 시
                    case 'k': play(Hamster.NOTE_C_5); break; // 도
                    case 'l': play(Hamster.NOTE_D_5); break; // 레
                    case ';': play(Hamster.NOTE_E_5); break; // 미
                    case '\'': play(Hamster.NOTE_F_5); break; // 파
                }
            }
        });
    }

    public static void main(String[] args) {
        new Controller().run();
    }
}

도#, 미b 등의 반음을 추가하여 완전한 피아노를 만들어 봅시다.

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;

import org.roboid.hamster.Hamster;

@SuppressWarnings("serial")
public class Controller extends JFrame {
    private final Hamster hamster = new Hamster();

    private void play(int pitch) {
        hamster.note(0, 0.05); // 0.05 박자로 잠시 쉰다.
        hamster.note(pitch);
    }

    public void run() {
        setSize(100, 100);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);

        addKeyListener(new KeyAdapter() {
            // 키보드의 키를 누르면 호출된다.
            @Override
            public void keyPressed(KeyEvent event) {
                switch(event.getKeyChar()) {
                    case ' ': hamster.note(0); break; // 스페이스 키를 눌렀으면 소리를 끈다.
                    case 'a': play(Hamster.NOTE_C_4); break; // 도
                    case 'w': play(Hamster.NOTE_C_SHARP_4); break; // 도# (레b)
                    case 's': play(Hamster.NOTE_D_4); break; // 레
                    case 'e': play(Hamster.NOTE_E_FLAT_4); break; // 미b (레#)
                    case 'd': play(Hamster.NOTE_E_4); break; // 미
                    case 'f': play(Hamster.NOTE_F_4); break; // 파
                    case 't': play(Hamster.NOTE_F_SHARP_4); break; // 파# (솔b)
                    case 'g': play(Hamster.NOTE_G_4); break; // 솔
                    case 'y': play(Hamster.NOTE_G_SHARP_4); break; // 솔# (라b)
                    case 'h': play(Hamster.NOTE_A_4); break; // 라
                    case 'u': play(Hamster.NOTE_B_FLAT_4); break; // 시b (라#)
                    case 'j': play(Hamster.NOTE_B_4); break; // 시
                    case 'k': play(Hamster.NOTE_C_5); break; // 도
                    case 'o': play(Hamster.NOTE_C_SHARP_5); break; // 도# (레b)
                    case 'l': play(Hamster.NOTE_D_5); break; // 레
                    case 'p': play(Hamster.NOTE_E_FLAT_5); break; // 미b (레#)
                    case ';': play(Hamster.NOTE_E_5); break; // 미
                    case '\'': play(Hamster.NOTE_F_5); break; // 파
                }
            }
        });
    }

    public static void main(String[] args) {
        new Controller().run();
    }
}
목차
Hardware
  1. Hamster robot
  2. USB dongle
Preparation for Class
  1. Software installation
  2. Robot to PC connection
  3. Run example files
Basic
  1. Create a new project
  2. Work in the cloud PC environment (optional)
  3. Move on a board #1 (sequence, repetition)
  4. Move and turn
  5. Turn on LEDs and make a sound
  6. Command in order repeatedly
  7. Use proximity sensors
  8. Move on a board #2 (repeat while)
  9. Use floor sensors
  10. Use light and acceleration sensors
  11. Braitenberg's robot
Advanced
  1. Create a board game
  2. Keyboard events
  3. Graphical interface
  4. Line following with one sensor
  5. Line following with two sensors
  6. Follow hamster friends (2 people 1 pair)
  7. Follow a wall
  8. Imitating a robot cleaner
  9. Line following at intersection
  10. Escape a maze
Extension Kit
  1. Assembling
  2. Pin/socket layout
  3. Digital input - Press button to beep
  4. Digital output - LED is on when it is dark
  5. Digital output - flashing twinkling LED
  6. Digital output - LED is on in tilting direction
  7. Analog input - Rotating the potentiometer changes the pitch.
  8. Analog input - please do not let it get hot
  9. Analog Input - Move along the light
  10. PWM output - LED light gently brighter and darker
  11. PWM output - LED candle shakes in the wind
  12. Analog servo output - hamster robot has tail
More Advanced
  1. Behavior based robot control
  2. Path navigation
  3. Swap
Copyright Robot Software Education Institute. All rights reserved.
Please contact prof. Kwang-Hyun Park (akaii@kw.ac.kr) if you have any problem.