이벤트 발생에 의해 프로그램 흐름이 결정되는 방식의 프로그램 패러다임입니다.
각 이벤트 소스마다 이벤트 리스너와 연결합니다.
1. 이벤트 소스 객체 : 이벤트를 발생시킨 컴포넌트 객체입니다.
2. 이벤트 리스너 객체 : 이벤트 소스에서 발생한 이벤트를 처리하는 객체입니다.
3. 이벤트 핸들러 메서드 : 전달된 이벤트를 처리하는 메서드입니다.
현재 응용 프로그램 클래스가 리스너 인터페이스를 구현합니다.
-> 리스너 연결시 리스너로부터 구현된 this를 전달합니다.
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class HelloEx implements ActionListener{
private JFrame frame;
private JTextField text;
private JLabel label;
public HelloEx() {
frame=new JFrame("HelloEx");
buildGUI();
frame.setBounds(500,300,200,80);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
private void buildGUI() {
text=new JTextField();
JButton button=new JButton("확인");
button.addActionListener(this); //button에서 ActionEvent가 나나타면 나에게 전달
//=> 내가 가지고 있는 actionPerformed에게 ActionEvent를 전달해서 처리하기
label=new JLabel("Hello World");
frame.add(text, BorderLayout.CENTER);
frame.add(button, BorderLayout.EAST);
frame.add(label, BorderLayout.SOUTH);
}
public static void main(String[] args) {
new HelloEx();
}
@Override
public void actionPerformed(ActionEvent e) {
String name=text.getText();
label.setText("Hello, "+name);
text.setText("");
}
}
리스너 인터페이스를 구현하는 일반 클래스를 작성하고 추상 메서드를 구현합니다.
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class HelloEx_2{
private JFrame frame;
private JTextField text;
private JLabel label;
public HelloEx_2() {
frame=new JFrame("HelloEx");
buildGUI();
frame.setBounds(500,300,200,80);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
private void buildGUI() {
text=new JTextField();
label=new JLabel("Hello World");
JButton button=new JButton("확인");
button.addActionListener(new ActionEventHandler(text, label));
frame.add(text, BorderLayout.CENTER);
frame.add(button, BorderLayout.EAST);
frame.add(label, BorderLayout.SOUTH);
}
public static void main(String[] args) {
new HelloEx_2();
}
}
class ActionEventHandler implements ActionListener{
private JTextField text;
private JLabel label;
ActionEventHandler(JTextField text, JLabel label){
this.text=text;
this.label=label;
}
@Override
public void actionPerformed(ActionEvent e) {
String name=text.getText();
label.setText("Hello, "+name);
text.setText("");
}
}
응용 프로그램 클래스 안에 내부 클래스를 이용합니다.
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class HelloEx_3{
private JFrame frame;
private JTextField text;
private JLabel label;
public HelloEx_3() {
frame=new JFrame("HelloEx");
buildGUI();
frame.setBounds(500,300,200,80);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
private void buildGUI() {
text=new JTextField();
label=new JLabel("Hello World");
JButton button=new JButton("확인");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String name=text.getText();
label.setText("Hello, "+name);
text.setText("");
}
});
frame.add(text, BorderLayout.CENTER);
frame.add(button, BorderLayout.EAST);
frame.add(label, BorderLayout.SOUTH);
}
public static void main(String[] args) {
new HelloEx_3();
}
}
내부 클래스를 사용하면 별도 클래스 작성이 이벤트 핸들러만을 재정의하기 위해사용되었지만 이를 내부 클래스 사용으로 극복합니다.
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class HelloEx_4{
private JFrame frame;
private JTextField text;
private JLabel label;
public HelloEx_4() {
frame=new JFrame("HelloEx");
buildGUI();
frame.setBounds(500,300,200,80);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
private void buildGUI() {
text=new JTextField();
label=new JLabel("Hello World");
JButton button=new JButton("확인");
button.addActionListener(new ActionEventHandler());
frame.add(text, BorderLayout.CENTER);
frame.add(button, BorderLayout.EAST);
frame.add(label, BorderLayout.SOUTH);
}
class ActionEventHandler implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
String name=text.getText();
label.setText("Hello, "+name);
text.setText("");
}
}
public static void main(String[] args) {
new HelloEx_4();
}
}
리스너 객체에 대한 참조변수 없이 임시 객체를 생성하여 리스너 등록시 인수로 사용합니다.
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class HelloEx_5{
private JFrame frame;
private JTextField text;
private JLabel label;
public HelloEx_5() {
frame=new JFrame("HelloEx");
buildGUI();
frame.setBounds(500,300,200,80);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
private void buildGUI() {
text=new JTextField();
label=new JLabel("Hello World");
JButton button=new JButton("확인");
button.addActionListener(new ActionEventHandler());
frame.add(text, BorderLayout.CENTER);
frame.add(button, BorderLayout.EAST);
frame.add(label, BorderLayout.SOUTH);
}
class ActionEventHandler implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
String name=text.getText();
label.setText("Hello, "+name);
text.setText("");
}
}
public static void main(String[] args) {
new HelloEx_5();
}
}