자바의 이벤트 처리-2

25706 단어 JavaJava

어댑터(Adapter) 클래스

리스너 작성시 모든 추상 메소드를 구현해야 하는 부담이 있다.
• 리스너의 모든 메소드가 단순 리턴하도록 구현한 클래스
• 추상 메소드가 하나뿐인 리스너를 어댑터 클래스가 없다.
-> ActionListener, ItemListener, AdjustmentListener 는 어뎁터 클래스 x

class MouseAdapter implements MouseListener, MouseMotionListener, MouseWheelListener {
    public void mousePressed(MouseEvent e) {}
    public void mouseReleased(MouseEvent e) {}
    public void mouseClicked(MouseEvent e) {}
    public void mouseEntered(MouseEvent e) {}
    public void mouseExited(MouseEvent e) {}
    public void mouseDragged(MouseEvent e) {}
    public void mouseMoved(MouseEvent e) {}
    public void mouseWheelMoved(MouseEvent e) {}
}

마우스 어댑터 클래스 예제

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class MouseAdapterExample extends JFrame {

    private JButton jButton = new JButton("Java");

    public MouseAdapterExample() {
        super("MouseAdapter 예제");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container contentPane = getContentPane();
        
        contentPane.addMouseListener(new ExMouseListener());
        
        contentPane.setLayout(new FlowLayout());
        
        jButton.setSize(40, 30);
        jButton.setLocation(130, 85);
        contentPane.add(jLabel);
        
        setSize(300, 200);
        setVisible(true);
    }
    
    class ExMouseListener extends MouseAdapter {
        public void mousePressed(MouseEvent e) {
        	int x = e.getX();
        	int y = e.getY();
        	jButton.setText(x + ", " + y);
        }
    }
    
    public static void main(String[] args) {
        new MouseAdapter();
    }
}

실행 결과

화면 클릭 시

Key 이벤트와 포커스(Focus)

키 입력 시, 다음 세 경우 Key 이벤트 발생

• 키를 누르는 순간
• 누른 키를 떼는 순간
• 누를 키를 떼는 순간 (Unicode 키의 경우에만)

키 이벤트를 받을 수 있는 조건

• 모든 컴포넌트가 가능하지만, 현재 포커스를 가진 컨포넌트

포커스(Focus)

• 컴포넌트나 응용 프로그램이 키 이벤트를 독점하는 권한

• 포커스 설정

// 컴포넌트가 포커스를 받을 수 있도록 설정
component.setFocusable(true);
// 컴포넌트에 포커스를 지정
component.requestFocus();

KeyListener의 메소드

// 키를 누르는 순간
void keyPressed(KeyEvent e) {
    ....
}

// 누른 키를 떼는 순간
void keyReleased(KeyEvent e) {
    ....
}

// 키를 떼는 순간 Unicode 키가 입력된 경우
void keyTyped(KeyEvent e) {
    ....
}

키(Key)의 종류

유니코드 키

• 전 세계의 문자에 대한 코드 체계
• 문자들에 대해서만 유니 코드 값을 정의한다.
• A ~ Z, a ~ z, 0 ~ 9, !, @ , & 등

이벤트 호출 순서

  1. keyPressed()
  2. keyTyped()
  3. keyReleased()

유니코드가 아닌 키

• 문자 키가 아닌 키들 (제어 키)
• 정의된 유니코드 값 없는 키들
• 키마다 키 코드 값(가상 키 코드 값)이 정의되어 있다.
• < Fuction >, < Home >, < Up >, < Shift > 등

이벤트 호출 순서

  1. keyPressed()
  2. keyReleased()

가상 키

모든 키에 자바의 가상 키 코드가 정의되어 있다.
• 가상 키 값으로 어떤 키인지 비교 판단 가능
• KeyEvent 클래스에 상수로 선언

입력된 키 판별

• 키가 입력되면 키 정보를 가진 이벤트 객체를 생성
-> KeyEvent 객체
-> KeyEvent 객체가 이벤트 리스너에 전달된다.

문자 코드(유니코드) 알아내기

char KeyEvent.getKeyChar()
• 눌러진 키가 문자 키인 경우에만 작동
• 눌러진 키의 문자 코드(유니코드) 리턴

키의 가상 키 값 알아내기

int KeyEvent.getKeyCode()
모든 키에 대해 작동
입력된 키를 판별하기 위해 가상키 값과 비교
• KeyEvent 클래스의 상수로 정의됨

키 이름 문자열 리턴

String KeyEvent.getKeyText(int keyCode)
• static 메소드
• 매개변수 keyCode의 가상 키에 해당하는 키의 이름 문자열 리턴

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class KeyEventExample extends JFrame {
    private JLabel[] jLabels;
    
    public KeyEventExample() {
        super("Key Listener 예제");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container contentPane = getContentPane();
        contentPane.setLayout(new FlowLayout());
        
        contentPane.addKeyListener(new ExKeyListener());
        
        jLabels = new JLabel[3];
        jLabels[0] = new JLabel(" getKeyCode() ");
        jLabels[1] = new JLabel(" getKeyChar() ");
        jLabels[2] = new JLabel(" getKeyText() ");
        
        for(int i=0; i<jLabels.length; i++) {
            contentPane.add(jLabels[i]);
            jLabels[i].setOpaque(true);
            jLabels[i].setBackground(Color.ORANGE);
        }
        
        setSize(300, 200);
        setVisible(true);
        contentPane.setFocusable(true);
        contentPane.requestFocus();
    }
    
    class ExKeyListener extends KeyAdapter {
        public void keyPressed(KeyEvent e) {
            int keyCode = e.getKeyCode();
            char keyChar = e.getKeyChar();
            
            jLabels[0].setText(Integer.toString(keyCode));
            jLabels[1].setText(Character.toString(keyChar));
            jLabels[2].setText(e.getKeyText(keyCode));
        }
    }
    
    public static void main(String[] args) {
        new KeyEventExample();
    }
}

실행 결과

키 클릭 후

좋은 웹페이지 즐겨찾기