Java GUI에서도 사용자의 반응에 대한 이벤트 처리가 가능함
하지만 JavaScript에서의 처리보다 훨씬 복잡함

<🖱 GUI 이벤트 전달의 전체 흐름 구조>

[사용자 입력]

[OS가 감지]
이벤트 종류: MouseEvent, KeyEvent, TouchEvent

[OS가 이벤트 메시지 생성]

[프로그램에게 전달]

[JVM이 이벤트 객체 생성]
ActionEvent, MouseEvent, KeyEvent 등 이벤트 정보 객체를 JVM이 생성

[리스너 메서드에게 이벤트 객체 전달]


UI컴포넌트와 리스너👂 객체 연결하기

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만 가능)


💡 보완 팁: 어댑터(Adapter)

MouseListener는 메서드가 5개라 다 구현해야 하는데, 필요 없는 메서드도 구현해야 해서 귀찮다... 어떡하지?

이때 MouseAdapter라는 추상 클래스를 쓰면 필요한 메서드만 골라서 구현 가능

frame.addMouseListener(new MouseAdapter() {
    public void mousePressed(MouseEvent e) {
        System.out.println("마우스 눌림");
    }
});

▶ XXXListener → 인터페이스 (모든 메서드 필수 구현)
▶ XXXAdapter → 추상 클래스 (선택 구현 가능)

profile
아이들의 가능성을 믿었던 마음 그대로, 이제는 나의 가능성을 믿고 나아가는 중입니다.🌱

0개의 댓글