반응형
이벤트를 처리하기 위해선 인터페이스를 사용해야 하는데, 인터페이스엔 구현해야 하는 추상 메서드가 제공된다.
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 |