Java GUI에서도 사용자의 반응에 대한 이벤트 처리가 가능함
하지만 JavaScript에서의 처리보다 훨씬 복잡함
<🖱 GUI 이벤트 전달의 전체 흐름 구조>
[사용자 입력]
↓
[OS가 감지]
이벤트 종류:MouseEvent,KeyEvent,TouchEvent등
↓
[OS가 이벤트 메시지 생성]
↓
[프로그램에게 전달]
↓
[JVM이 이벤트 객체 생성]
ActionEvent,MouseEvent,KeyEvent등 이벤트 정보 객체를 JVM이 생성
↓
[리스너 메서드에게 이벤트 객체 전달]

package gui.event;
import java.awt.Frame;
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.TextField;
import java.awt.Choice;
public class ActionTest{
public static void main(String[] args) {
Frame frame=null;
Button bt=null;
TextField txt=null;
Choice ch=null; //html에서의 select박스
frame=new Frame();
bt=new Button("click me!");
txt=new TextField(20);
ch=new Choice();
ch.addItem("Choose your mail server");
ch.addItem("@naver.com");//html에서의 <option>
ch.addItem("@daum.net");
ch.addItem("@gmail.com");
//Js의 addEventListener()메서드처럼
//이벤트 발생 주체(UI 컴포넌트)에
//리스너 객체를 연결하는 구조로 진행
bt.addActionListener(new MyActionListener()); //버튼과 이벤트를 구현한 리스너와의 연결
txt.addKeyListener(new MyKeyListener()); //텍스트 필드와 리스너와의 연결 (내가 구현한 리스너 객체 넣기)
ch.addItemListener(new MyItemListener());
frame.addMouseListener(new MyMouseListener());
frame.setLayout(new FlowLayout()); //대왕버튼 만들어지지 않게 Flow
frame.add(bt);
frame.add(txt);
frame.add(ch);
frame.setSize(300,400);
frame.setVisible(true);
}
}
<처음보는 객체에 대한 대처법>
객체명으로 기능 예측하기, 예측이 안되면 조사하자
사용하기 위해 메모리 올리는 방법을 파악 (객체의 유형은 3가지)
- 일반 클래스 : new 생성자( )
- 추상 클래스 : 자식으로 구현한 후 자식을 new 생성자( )
- 인터페이스 : 자식으로 구현한 후 자식을 new 생성자( )
⭐JAVA API문서를 적극 활용하기⭐
✅ 모든 리스너는 인터페이스이므로 “내가 구현한 객체”를 넣어야 함
✅ 모든 리스너는 인터페이스이므로 'implements'와 메서드 오버라이딩 필수
/*------------------------
Action이벤트만을 청취할 수 있는
ActionListener를 재정의
------------------------*/
package gui.event;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class MyActionListener implements ActionListener{
//부모인 ActionListener의 추상메서드 오버라이딩
public void actionPerformed(ActionEvent e){
//개발자는 이벤트가 발생했을 때, 처리할 로직을 여기에 작성
//addEventListener("click", function(){};
// → JS에서의 익명함수 영역과 동일하다고 보면 됨
System.out.println("나 눌렀어?");
}
}
/*------------------------
Key이벤트만을 청취할 수 있는
KeyListener를 재정의
------------------------*/
package gui.event;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
/*OS를 거쳐 JVM으로부터 전달되는 키보드 이벤트를 청취하기 위한 객체인
KeyListener를 재정의 해보자*/
public class MyKeyListener implements KeyListener{
//KeyListener가 보유한 추상메서드를 오버라이딩
public void keyTyped(KeyEvent e){//keyReleased와 비슷
}
//키보드 누를 때 (Js의 keydown)
public void keyPressed(KeyEvent e){
System.out.println("눌렀어?");
}
//키보드 눌렀다 뗄 때 (Js의 keyup)
public void keyReleased(KeyEvent e){
System.out.println("눌렀다가 뗐어?");
}
}
/*------------------------
Item이벤트만을 청취할 수 있는
ItemListener를 재정의
------------------------*/
package gui.event;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;
public class MyItemListener implements ItemListener{
public void itemStateChanged(ItemEvent e){
System.out.println("아이템 바꿨어?");
}
}
/*------------------------
Mouse이벤트만을 청취할 수 있는
MouseListener를 재정의
------------------------*/
package gui.event;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
public class MyMouseListener implements MouseListener{
public void mouseClicked(MouseEvent e){
System.out.println("mouseClicked 호출");
}
public void mouseEntered(MouseEvent e){
System.out.println("mouseEntered 호출");
}
public void mouseExited(MouseEvent e){
System.out.println("mouseExited 호출");
}
public void mousePressed(MouseEvent e){
System.out.println("mousePressed 호출");
}
public void mouseReleased(MouseEvent e){
System.out.println("mouseReleased 호출");
}
}
// 항상 이 구조
컴포넌트.addXXXListener(new XXXListener(){
@Override
public void 메서드이름(XXXEvent e) {
// 이벤트 처리 로직
}
});
참고) 리스너👂 정의 방식
1️⃣ 외부 클래스로 따로 빼는 방식
(내가 한 방법)
2️⃣ 익명 내부 클래스 사용
(요약 포맷 방법)
3️⃣ Java 8 이상이면 람다식도 가능
(ActionListener만 가능)
MouseListener는 메서드가 5개라 다 구현해야 하는데, 필요 없는 메서드도 구현해야 해서 귀찮다... 어떡하지?
이때 MouseAdapter라는 추상 클래스를 쓰면 필요한 메서드만 골라서 구현 가능
frame.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
System.out.println("마우스 눌림");
}
});
▶ XXXListener → 인터페이스 (모든 메서드 필수 구현)
▶ XXXAdapter → 추상 클래스 (선택 구현 가능)