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 |
댓글