일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- git
- 프로그래머스
- MSBuild
- py
- 다시풀기
- 대학원
- androidstudio
- 안드로이드스튜디오
- 내휴학생활중의아주큰일
- SQL
- BFS
- java
- SWEA
- 대학원일기
- 컨트리뷰톤
- D3
- 컴퓨터비전
- 어렵다
- level1
- 휴학
- level4
- Matrix Factorization
- Python
- level3
- Github
- WebOS
- build
- 파이썬
- LEVEL2
- 자바
- Today
- Total
bit가 눈 앞에서 왔다갔다
자바 이벤트 처리(2)_Key Event, Mouse Event 본문
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 |