본문 바로가기
개발자 양성과정 필기노트/JAVA

JFrame 이벤트처리하는 5가지 방법

by jono 2021. 11. 2.

I. 이벤트처리 5가지 방법


 1. 리스너 인터페이스를 구현하여 그 객체를 addXXXListener() 메서드의 매개변수로 전달하기 

public void showFrame() {
		JFrame f = new JFrame("이벤트 처리");
		f.setBounds(600,400,300,200);
       
		MyWindowListener listener = new MyWindowListener();
		f.addWindowListener(listener);
		f.setVisible(true);
}
    
	public static void main(String[] args) {new Ex01();}

class MyWindowListener implements WindowListener{
	@Override
	public void windowOpened(WindowEvent e) {
		// 처음 프로그램이 실행되어 프레임이 표시될때 호출됨
		System.out.println("window opened");
	}
	@Override
	public void windowClosing(WindowEvent e) {
		// 마지막 프로그램이 종료될 때 호출됨
		System.out.println("window closing");
		System.exit(0);// 0: 정상종료, 0이외의 값: 비정상적 종료
	}
	@Override
	public void windowClosed(WindowEvent e) {
		// 프로그램 종료 '후' 호출됨
		System.out.println("window closed");
	}
	@Override
	public void windowIconified(WindowEvent e) {
		// 프레임 최소화될 때 호출됨
		System.out.println("window iconfied");
	}
	@Override
	public void windowDeiconified(WindowEvent e) {
		// 프레임 최소화가 취소될 때 호출됨
		System.out.println("window deiconfied");
	}
	@Override
	public void windowActivated(WindowEvent e) {
		// 프레임이 화면에 띄워져서 사용자와 상호작용이 가능할 때 호출된다.
		System.out.println("window activated");
	}
	@Override
	public void windowDeactivated(WindowEvent e) {
		// 프레임이 화면에 떠있지 않아서 사용자와 상호작요잉 불가능할 때 호출된다.
		System.out.println("window deactivated");
	}

 2. 리스너 인터페이스를 미리 구현해놓은 어댑터클래스를 상속받기 

-> 메서드를 선택적으로 오버라이딩이 가능함

public void showFrame() {
	JFrame f = new JFrame("이벤트 처리연습 -2");
	f.setSize(300,300);
    
	MyWindowAdapter listener = new MyWindowAdapter();
	f.addWindowListener(listener);
    
	f.setVisible(true);
}
public static void main(String[] args) {new Ex02();}


class MyWindowAdapter extends WindowAdapter{
	@Override
	public void windowClosing(WindowEvent e) {
		System.out.println("window closing...");
		System.exit(0);
}

 3. 이벤트리스너를 내부클래스 형태로 정의하기 

-> GUI클래스 내부에 핸들러 클래스를 정의함.

-> 외부에 정의하는 방법과 클래스 모양은 동일하나, 클래스 정의 위치만 달라진다.

-> 인스턴스 멤버와 동일한 위치에 정의하므로 인스턴스 내부클래스라고도 함.

-> 인스턴스 내 여러 메서드에서 공유가 가능하다.

    # 위치에 따른 차이점

       1. 멤버 레벨에서 정의하는 멤버 내부클래스 : 멤버변수의 성격과 동일한 클래스가 됨

       2. 메서드 내부에 정의하는 로컬 내부클래스 : 로컬변수의 성격과 동일한 클래스가 됨

public void showFrame() {
		JFrame f = new JFrame(); 
		f.setSize(300,300);

		MyMemberlWindowAdapter Memberlistener = new MyMemberlWindowAdapter();
		f.addWindowListener(Memberlistener);
		f.setVisible(true);
}
	
class MyMemberlWindowAdapter extends WindowAdapter{
	@Override
	public void windowClosing(WindowEvent e) {
		System.out.println("window closing... using member level class");
		System.exit(0);
	}
}
		
public static void main(String[] args) {new Ex03();}

 4. 이벤트 리스너를 익명내부클래스 형식으로 정의하기 

-> '멤버' 내부클래스 형태로 정의함

=> 인스턴스 내의 여러 메서드서 공유가능함.

public void showFrame() {
	JFrame f = new JFrame("이벤트처리연습 - 4");
	f.setSize(300,200);		
	f.setVisible(true);

	f.addWindowListener(Memberlistener);
}
	
WindowAdapter Memberlistener = new WindowAdapter() {
	@Override
	public void windowClosing(WindowEvent e) {
		System.out.println("window closing using <<<Member>>> Anonymous Inner Class");
		System.exit(0);
	}
};
    
 public static void main(String[] args) {new Ex04();}

 5. 이벤트 리스터를 임시객체 형태로 정의하기 

- addXXXListener메서드의 매개변수로 익명 내부클래스를 구현하는 코드를 바로 기술하여 객체를 전달하는 방법.

- 별도의 변수가가 없으므로 1회용 리스너객체가 된다.

-> 따라서 동일한 이벤트를 다른 대상에도 적용해야하는 경우라면 4단계 방법이 낫다.

   # 기본문법

   JFrame객체.addXXXListener( new 리스너이름(){ 추상메서드 구현 } );

public void showFrame() {
	JFrame f = new JFrame("이벤트처리연습 - 5 - 임시객체형태");
	f.setSize(300,200);
    f.setVisible(true);
    
	f.addWindowListener(new WindowAdapter() {
		//메서드 구현부 - 오버라이딩
		@Override
		public void windowClosing(WindowEvent e) {
			System.out.println("window closing... by 임시객체형태 정의");
			System.exit(0);
		}
	});		
}

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

 

'개발자 양성과정 필기노트 > JAVA' 카테고리의 다른 글

BigInteger / BigDecimal  (0) 2021.11.13
Enum  (0) 2021.11.13
Date, Calendar 클래스 / Time패키지  (0) 2021.10.10
String / StringBuffer, StringTokenizer  (0) 2021.10.10
Random, Arrays 클래스  (0) 2021.10.09

댓글