JAVA/공부

자바 Adapter 클래스

GaeGim 2022. 9. 1. 21:48
반응형

이벤트를 처리하기 위해선 인터페이스를 사용해야 하는데, 인터페이스엔 구현해야 하는 추상 메서드가 제공된다.

 

Adapter 클래스가 인터페이스를 구현했기 때문에 이벤트 처리를 구현할 때 인터페이스 대신 Adapter 클래스를 사용해 원하는 메서드만 구현해 쓰면 된다.

 

그렇지 않으면 실제로 필요하지 않은 메서드도 모두 코드에 작성해줘야 하기 때문에 지저분해지기 때문이다.

 

 

 

  • 사용방법

1) 외부 클래스에 별도 클래스를 생성해 생성자로 필드 공유.

import java.awt.*; 
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class Main extends Frame implements ActionListener {

	Panel p1, p2, p3;
	Button b1, b2;
	TextArea ta;
	TextField tf;

	public Main() {
		super("EventHandler");

		p1 = new Panel();
		p2 = new Panel();
		p3 = new Panel();

		//행 수를 지정하며 새 컴포넌트 생성.
		tf = new TextField(35);
		ta = new TextArea(10, 35);

		b1 = new Button("Exit");
		b2 = new Button("Clear");

		p1.add(tf);
		p2.add(ta);
		p3.add(b2);
		p3.add(b1);

		add("North", p1);
		add("Center", p2);
		add("South", p3);

		b1.addActionListener(this);
		b2.addActionListener(this);
		
        //컴포넌트에 키 이벤트를 받을 키 리스너를 추가.
        //외부클래스의 생성자.
		tf.addKeyListener(new KeyEventHandler(ta, tf));
        //윈도우에서 이벤트를 받을 윈도우 리스너 추가.
		addWindowListener(new WindowEventHandler());

		add(ta, BorderLayout.CENTER);

		setBounds(300, 300, 300, 200);
		setVisible(true);
	}

	public void actionPerformed(ActionEvent e) {	//핸들러.
		String str = e.getActionCommand();
		if (str.equals("Clear")) {
			ta.setText("");
			tf.setText("");
			tf.requestFocus();
		} else if (str.equals("Exit")) {
			System.exit(0);
		}
	}

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

class KeyEventHandler extends KeyAdapter {
	TextArea ta;
	TextField tf;
	public KeyEventHandler(TextArea ta, TextField tf) {
		this.ta = ta;
		this.tf = tf;
	}
	public void keyTyped(KeyEvent e) {
		if (e.getKeyChar() == KeyEvent.VK_ENTER) {
			ta.append(tf.getText() + "\n");
			tf.setText("");
		}
	}
}

class WindowEventHandler extends WindowAdapter {
	public void windowClosing(WindowEvent e) {
		System.exit(0);
	}
}

 

 

 

2) 이너 클래스로 아우터 클래스의 멤버 공유.

import java.awt.*; 
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class Main extends Frame implements ActionListener {
	Panel p1, p2, p3;
	Button b1, b2;
	TextArea ta;
	TextField tf;

	public Main() {
		super("EventHandler");

		p1 = new Panel();
		p2 = new Panel();
		p3 = new Panel();

		tf = new TextField(35);
		ta = new TextArea(10, 35);

		b1 = new Button("Exit");
		b2 = new Button("Clear");

		p1.add(tf);
		p2.add(ta);
		p3.add(b2);
		p3.add(b1);
		
		add("North", p1);
		add("Center", p2);
		add("South", p3);

		b1.addActionListener(this);
		b2.addActionListener(this);
		
		tf.addKeyListener(new KeyEventHandler());	//변수 불필요.
        //익명 이너 클래스.
		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});

		add(ta, BorderLayout.CENTER);

		setBounds(300, 300, 300, 200);
		setVisible(true);
	}
	
    //멤버 이너 클래스.
	class KeyEventHandler extends KeyAdapter {
		public void keyTyped(KeyEvent e) {
			if (e.getKeyChar() == KeyEvent.VK_ENTER) {
				ta.append(tf.getText() + "\n");
				tf.setText("");
			}
		}
	}

	public void actionPerformed(ActionEvent e) {
		String str = e.getActionCommand();
		if (str.equals("Clear")) {
			ta.setText("");
			tf.setText("");
			tf.requestFocus();
		} else if (str.equals("Exit")) {
			System.exit(0);
		}
	}

	public static void main(String[] args) {
		new Main();
	}
}
반응형

'JAVA > 공부' 카테고리의 다른 글

쿠키와 세션(+캐시)  (0) 2022.09.03
OSI 7계층  (0) 2022.09.02
자바 AWT 이벤트  (0) 2022.09.01
스레드  (0) 2022.07.11
예외 처리  (0) 2022.07.11