bit가 눈 앞에서 왔다갔다

자바 이벤트 처리(2)_Key Event, Mouse Event 본문

언어!/Java

자바 이벤트 처리(2)_Key Event, Mouse Event

헬린인형 2021. 5. 9. 00:14

1. Key Event와 Key Listener

Key 이벤트: 사용자가 키를 입력할 때 발생하는 이벤트. 포커스(키 입력 독점권)를 가진 컴포넌트에만 키 이벤트 전달

스윙 프로그램에서 강제로 임의의 컴포넌트에 포커스 줄 때 필요한 코드

c.setFocusable(true);		//난 이거 필요함
c.requestFocus();

component.setFocusable(true)는 컴퓨터의 실행 환경에 따라 필요함. (없으면 키 입력 못 받는 경우가 있음)

 

컴포넌트에 포커스 주는 시점

1. 스윙 프레임이 만들어질 때, 컴포넌트에게 포커스를 주고자 한다면 setVisible(true) 후 requestFocus()

setVisible(true);
c.setFocusable(true);
c.requestFocus();

setVisible()메소드는 프레임 출력 후 포커스를 임의로 움직임

2. 사용자가 마우스로 컴포넌트를 클릭하면 컴포넌트가 포커스를 얻도록 작성

 

Key 이벤트 발생과 Key Listener 메소드 호출

keypPressed(): 키 누르는 순간 -> (keyTyped(): 누른 키를 떼는 순간(유니코드의 경우에만)) -> keyReleased(): 누른 키를 떼는 순간

(유니코드 - 문자를 컴퓨터에서 표현할 때 사용, 문자가 아닌 제어키들에는 없음. ex) Fn, Tab 등 )

 

키 이벤트 리스너 등록 -> addKeyListener()

KeyListener 메소드 : void keyPressed(KeyEvent e) / void keyReleased(KeyEvent e) / void keyTyped(KeyEvent e)

 

문자 입력 판별

1. char KeyEvent.getKeyChar() : 입력된 코드의 유니코드 리턴

public void keyPressed(KeyEvent e) {
	if(e.getKeyChar() == 'q')	
    	System.exit(0);
}

 

2. int keyEvent.getKeyCode() : 유니코드 포함 모든 키에 대해 정수형 키 코드 값 리턴

키 코드는 운영체제, 하드웨어에 따라 서로 다름. 판별 시 getKeyCode() 리턴 키 값과 가상 키 값 비교

public void keyPressed(KeyEvent e) {
	if(e.getKeyCode() == KeyEvent.VK_F5)	//가상 키는 VK로 시작
    	System.exit(0);
}

(유니코드가 아닌 경우, getKeyCode와 가상 키 값을 비교한다)

 

*입력받은 키의 키코 드, 유니코드, 키 이름을 보여주는 코드

package chapter10;

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

public class StudyEvent extends JFrame {
	//private JLabel [] keyMessage;
	private JLabel [] keyMessage = new JLabel[3];
	
	public StudyEvent() {
		setTitle("key listener예제");
		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("get KeyCode() ");
		keyMessage[1] = new JLabel("get KeyCode() ");
		keyMessage[2] = new JLabel("get KeyCode() ");
	
		for (int i=0;i<keyMessage.length;i++) {
			c.add(keyMessage[i]);
			keyMessage[i].setOpaque(true);		//불투명 속성
			keyMessage[i].setBackground(Color.yellow);
		}
		
		setSize(300,300);
		setVisible(true);
			
		c.setFocusable(true);		//난 이거 필요함
		c.requestFocus();
	}
		
	public class MyKeyListener extends KeyAdapter {

		@Override
		public void keyTyped(KeyEvent e) {
			// TODO Auto-generated method stub
			System.out.println("key typed");
		}

		@Override
		public void keyPressed(KeyEvent e) {
			// TODO Auto-generated method stub
			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("key pressed");
		}

		@Override
		public void keyReleased(KeyEvent e) {
			// TODO Auto-generated method stub
			System.out.println("key released");
		}

	}

	public static void main(String [] args) {
		new StudyEvent();
	}
}

 

2. MouseEvent,MouseListener, MouseMotionListener, MouseWheelListener

Mouse 이벤트 : 사용자의 마우스 조작에 따라 발생하는 이벤트

(mouse 이벤트 경우, 메소드 1번 포스트의 표 1, 2 참고

+ MouseWheelListener 리스너: 마우스 휠이 구르는 동안 / 메소드 : void mouseWheelMoved(MouseWheelEvent e) )

 

*마우스가 눌러진 위치에서 그대로 떼어지면 메소드 호출 순서

mousePressed() -> mouseReleased() -> mouseClicked()

*마우스가 드래그 되면 호출 순서

pressed, dragged, .... dragged, released  -> dragged가 반복적으로 호출, 눌러진 위치와 떼어진 위치가 달라서 mouseClicked() 호출 안됨

(mouseClicked() -> 마우스가 눌러진 위치에서 그대로 떼어질 때 호출 / mouseReleased() -> 눌러진 위치와 떼어진 위치가 같던 다르던 호출)

 

마우스 리스너 달기

(1)의 두번째 표의 mouse이벤트 처리는 mouseListener를 작성해서 컴포넌트에 등록

component.addMouseListener(myMouseListener);

동일 컴포넌트가 mouseDragged(), mouseMoved() 이벤트를 함께 처리하려면 MouseMotionListener 따로 등록

component.addMouseMotionListener(myMouseMotionListener);

 

MouseEvent 객체

mouse 이벤트나 MouseMotion 이벤트 정보 제공하는 객체

//마우스 포인터 위치
int getX()
int getY()
Point getPoint()		//마우스 포인터의 위치를 point 객체로 리턴. point 객체에 x,y 정보 있음

//마우스 클릭 횟수
int getClickCount()		//더블 클릭 인식에 이용

public void mouseClicked(MouseEvent e) {
	if(e.getClickCount() == 2) {
 		   //더블클릭 처리
    }
}

//마우스 버튼 리턴 메소드
int getButton()			//눌러진 마우스 버튼 번호 리턴
				//리턴값 NOBUTTON, BUTTON1 ~ BUTTON3 BUTTON1:왼쪽, BUTTON3:오른쪽
public void mousePressed(MouseEvent e) {
	if(e.getButton() == MouseEvent.BUTTON1)
    	System.out.println("Left Button Pressed");
    }
}

 

MouseEvent 예제 (책 예제를 내 맘대로 막 섞어서 다소 길고 뭐가 많음^0^)

package chapter10;

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

public class StudyEvent extends JFrame {
	private JLabel la = new JLabel("hello");
	
	public StudyEvent() {
		setTitle("마우스 움직임에 따라 변경 하기!");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		Container c = getContentPane();
		c.setLayout(new FlowLayout()); //임의의 위치에서 마음대로 움직이기 위해 컨텐트팬의 배치관리자 삭제
		
		MyMouseListener listener = new MyMouseListener();	//리스너 객체 생성
		c.addMouseListener(listener);			// mouse listener 리스너 등록
		c.addMouseMotionListener(listener);		//mouse motion listener 리스너 등록
		c.addMouseWheelListener(listener);
		
		c.add(la);
		setSize(300,300);
		setVisible(true);
	}

	class MyMouseListener implements MouseListener, MouseMotionListener, MouseWheelListener {
		//MouseListener이면서 MouseMotionListener로 작동시키기 위해 두 인터페이스 모두 구현
		//MouseListener 5개 메소드
		public void mousePressed(MouseEvent e) {
			la.setText("mousePressed (" + e.getX()+ "," + e.getY() + ")" );
		}
		public void mouseReleased(MouseEvent e) {
			la.setText("MouseReleased ("+ e.getX()+ "," + e.getY() + ")" );
		}
		public void mouseClicked(MouseEvent e) {
			la.setText("MouseClicked ("+ e.getX()+ "," + e.getY() + ")" );
			if(e.getButton() == MouseEvent.BUTTON3) {
				Component c = (Component)e.getSource();
				c.setBackground(Color.RED);
			}
			if(e.getClickCount()==2) {
				int r = (int)(Math.random()*256);
				int g = (int)(Math.random()*256);
				int b = (int)(Math.random()*256);
				
				Component c = (Component)e.getSource();	//이벤트 발생한 소스 컨포넌트의 레퍼런스(참조) 리턴
				c.setBackground(new Color(r,g,b));
			}
		}
		public void mouseEntered(MouseEvent e) {
			Component c = (Component)e.getSource();		//마우스가 올라가 컴포넌트 알아내기
			c.setBackground(Color.cyan);
		}
		public void mouseExited(MouseEvent e) {
			Component c = (Component)e.getSource();		//마우스가 내려간 컴포넌트 알아내기
			c.setBackground(Color.yellow);
		}
		
		//MouseMotionListener의 2개 메소드 구현
		public void mouseDragged(MouseEvent e) {
			la.setText("MouseDragged ("+ e.getX()+ "," + e.getY() + ")" ); //마우스 드래그 하는 동안 계속 호출
		}
		public void mouseMoved(MouseEvent e) {
			la.setText("MouseMoved (" + e.getX()+ "," + e.getY() + ")" );  //마우스가 움직이는 동안 계속 호출
		}
		public void mouseWheelMoved(MouseWheelEvent e) {
			la.setText("마우스 휠 움직이는 중");
		}
	}
	

	public static void main(String [] args) {
		new StudyEvent();
	}
}

 

 

자바 복습 4회차!! 생각보다 재밌당. 그동안 자바 복잡한 거 같아서 싫었는데 생각 바뀌는 중ㅎㅎ

반응형

'언어! > Java' 카테고리의 다른 글

자바 이벤트 처리(1)  (0) 2021.05.08
GUI 기초_컨테이너, 배치  (0) 2021.05.02
GUI 기초_AWT, Swing  (0) 2021.04.30
JAVA 복습 목표!  (0) 2021.04.30
Comments