1. 이벤트 객체
현재 발생한 이벤트에 관한 정보 가진 객체. 이벤트 리스너에 전달됨.
[이벤트 처리를 위한 import문]
import java.awt.event.*; // 이벤트 처리 필요시 import
import javax.swing.event.*; // 스윙 이벤트 다룰 경우 추가 import
[이벤트 객체 메소드]
· getSource()
: 이벤트가 발생된 컴포넌트의 레퍼런스 리턴.
리턴타입은 Object이므로 캐스팅해서 사용하면 됨
JButton b = (JButton)event.getSource(); // b는 이벤트가 발생한 버튼의 레퍼런스
[이벤트 객체와 이벤트 발생 경우]
2. 이벤트 리스너
- 이벤트를 처리하는 코드. 컴포넌트에 연결돼있어야 작동함.
- 이벤트 발생할 때마다 이벤트 리스너 실행됨
[이벤트 리스너 인터페이스]
[이벤트 리스너 작성]
ex) 버튼 클릭 시 텍스트 변경하는 이벤트리스너
1. 이벤트와 이벤트 리스너 인터페이스 선택
- 이벤트객체 : ActionEvent- 이벤트 종류 : Action- 이벤트 리스너 : ActionListener
2. 이벤트 리스너 클래스 작성
리스너 인터페이스를 상속받는 클래스 작성, 추상메소드 모두 구현
class MyListener implements ActionListener { // ActionListener 인터페이스 상속
public void actionPerformed(ActionEvent e){ // 버튼 클릭시 호출되는 메소드
JButton b = (JButton)e.getSource(); // 클릭된 버튼 알아내기 getSource()
if(b.getText().equals("Action"))
b.setText("액션");
else
b.setText("Action");
}
}
3. 컴포넌트에 이벤트 리스너 등록
- 이벤트를 처리할 컴포넌트에 이벤트 리스너 등록
- 컴포넌트에 이벤트 리스너 등록 시 add□Listener(listner); ( □안에 이벤트 이름 넣기)
MyListener listener = new MyListener(); // 리스너 객체 생성
btn.addActionListener(listener); // 리스너 등록
[이벤트 리스너 클래스 작성 방법]
· 독립 클래스로 이벤트 리스너 작성 : 가장 전형적. 리스너 코드가 길 때 적합. 다른 클래스 멤버에 접근 어렵
· 내부 클래스로 이벤트 리스너 작성 : 자신을 둘러싼 클래스의 멤버에 접근 가능
· 익명 클래스로 이벤트 리스너 작성 : new와 함께 사용되어 바로 객체 생성
b.addActionListener(new ActionListener() { // 위의 코드를 익명클래스 리스너로 작성
public void actionPerformed(ActionEvent e){
JButton b = (JButton)e.getSource();
if(b.getText().equals("Action"))
b.setText("액션");
else
b.setText("Action");
}
}
3. 어댑터 클래스
인터페이스를 미리 구현해놓은 클래스
리스너 인터페이스의 모든 메소드를 구현해야 하는 부담을 줄여줌.
[리스너 인터페이스와 어댑터 클래스]
사용 예시:
JLabel la;
contentPane.addMouseListener(new MyAdapter());
class MyAdapter extends MouseAdapter { // MouseAdapter 이용
public void mousePressed(MouseEvent e) {
int x = e.getX();
int y = e.getY();
la.setLocation(x,y);
}
}
4. Key 이벤트
- key 이벤트 : 사용자가 키를 입력할 때 발생하는 이벤트
- 포커스 : 키 입력의 독점권. 현재 포커스를 가진 컴포넌트에만 key 이벤트 전달됨.
[컴포넌트에 포커스 주는 법]
↓ 아래 두 코드가 모두 필요함.
· setFoucusable(true) : 컴포넌트가 포커스 받을 수 있도록 설정
· requestFocus() : 컴포넌트에게 포커스 줌
- 스윙 프레임이 만들어질 때 컴포넌트에 포커스 주기
: setVisible(true)를 먼저 실행해야 함.
setVisible(true); // 스윙 프레임 출력
component.setFocusable(true); // 컴포넌트가 포커스 받을 수 있도록 설정
component.requestFocus(); // 컴포넌트에게 포커스 줌
- 사용자가 마우스로 컴포넌트 클릭 시 포커스 얻도록 하기
component.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
Component c = (component)e.getSource(); // 클릭된 컴포넌트
component.setFocusable(true); // 컴포넌트가 포커스 받을 수 있도록 설정
component.requestFocus(); // 클릭된 컴포넌트에게 포커스 줌
}
}
[key 이벤트 리스너 달기]
component.addKeyListener(myKeyListener);
· keyPressed(KeyEvent e)
: 키를 누르는 순간
· keyReleased(KeyEvent e)
: 키를 떼는 순간
· keyTyped(KeyEvent e)
: 누른 키를 떼는 순간(유니코드 키일 때)
[입력된 키 판별]
· char KeyEvent.getKeyChar()
: 입력된 키의 문자코드 리턴.
public void keyPressed(KeyEvent e) {
if(e.getKeyChar() == 'q') // 입력된 키 판별
System.exit(0);
}
· int KeyEvent.getKeyCode()
: 입력된 키의 정수형 키 코드 값 리턴. 리턴한 키 코드와 가상키 값을 비교해야 함.
(가상키: KeyEvent 클래스에 VK_로 시작하는 static 상수)
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_F5) // F5키 눌러지면 프로그램 종료
System.exit(0);
}
가상키:
· String KeyEvent.getKeyText(int keyCode)
: 키 이름 문자열을 얻을 수 있음. 무슨 키 입력했는지..
5. Mouse 이벤트
* 드래그되는동안 mouseDragged()는 반복적으로 여러번 호출.
[마우스 리스너 달기]
- 위 표의 처음 5가지 경우:
component.addMouseListener(myMouseListener);
- 드래깅, 무브 이벤트 처리시 MouseMotion 리스너 따로 등록해야됨
component.addMouseMotionListener(myMouseMotionListener);
- 마우스 휠 리스너:
component.addMouseWheelListener(myWheelListener);
[MouseEvent 객체]
·마우스 포인터 위치(x,y)
int getX() // 마우스 포인터의 x좌표
int getY() // 마우스 포인터의 y좌표
Point getPoint() // 마우스 포인터 위치를 Point객체로 리턴. Point객체에 x,y정보 있음
·마우스 클릭 횟수
int getClickCount() // 마우스 클릭 횟수 리턴
·마우스 버튼
int getButton() // 눌러진 마우스 버튼의 번호 리턴
// NOBUTTON, BUTTON1(왼쪽버튼), BUTTON2, BUTTON3(오른쪽버튼)
- 마우스 휠 굴리면 mouseWheelMoved 메소드 호출됨
public void mouseWheelMoved(MouseWheelEvent e)
명품 JAVA Programming 참고
'개념 정리 > Java' 카테고리의 다른 글
[JAVA] 그래픽 (1) | 2023.10.26 |
---|---|
[JAVA] 스윙 컴포넌트(JLabel, JButton, JCheckBox, JRadioButton, JTextField, JList, JComboBox) (0) | 2023.10.26 |
[JAVA] GUI, 컨테이너, 컴포넌트, 스윙, 배치관리자 (0) | 2023.10.23 |
[JAVA] 파일 읽기, 쓰기, File 클래스 (0) | 2023.10.22 |
[JAVA] 제네릭·컬렉션, Vector<E>, ArrayList<E>, Iterator<E>, HashMap<K, V> (0) | 2023.10.21 |