6. 이벤트처리
- 이벤트 소스 (Event Source)
- 이벤트가 발생한 컴포넌트
- 사용자가 버튼을 눌렀을 때 이벤트가 잘생
- 버튼은 이벤트의 이벤트소스
- 이벤트 핸들러 (Event Handler)
- 이벤트가 발생했을 때 실행될 코드를 구현해놓은 클래스
- 이벤트 리스너 Event Listner)
- 이벤트를 감지하고 처리
- 이벤트 핸들러와 이벤트 소스를 연결
- 이벤트 처리 (Event Handling)
- 이벤트에 대한 수행코드를 작성하여 이벤트소스에 이벤트 리스너로 등록하는 것
- 이벤트참고
1. 이벤트 처리방법
- 이벤트 메서드 중 필요한 것을 찾는다
windowClosing(WindowEvent e)
- 선택한 메서드가 속해있는 인터페이스를 구현하는 클래스를 작성한다
class EventHandler implements WindowListener{
public void windowClosing(WindowEvent e) {
코드작성
} - 위에서 구현한 클래스의 인스터느를 생성해서 이벤트 소스에 리스너로 등록한다
f.addWindowListener(new EventHandler());
예시1
package com.awt.day3;
import java.awt.Frame;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
public class EventTest1 extends Frame {
public EventTest1() {
super("Event test");
this.setSize(300,200);
this.setVisible(true);
//3. 이벤트연결
this.addWindowListener(new EventHandler());
}
//2. 필요한 메서드가 있는 클래스 구현
class EventHandler implements WindowListener{
@Override
public void windowOpened(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override //1. 필요한 메서드, 닫기버튼 클릭시 닫힘
public void windowClosing(WindowEvent e) {
e.getWindow().dispose();
System.exit(0);
}
@Override
public void windowClosed(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowIconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowDeiconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowActivated(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowDeactivated(WindowEvent e) {
// TODO Auto-generated method stub
}
}
public static void main(String[] args) {
EventTest1 f = new EventTest1();
}
}
예시2
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ButtonActionEvent extends Frame {
private Button bt;
private TextField tf;
private Label lbResult;
public ButtonActionEvent() {
super("버튼 클릭 연습");
this.setLayout(new FlowLayout());
bt=new Button("확인");
tf = new TextField(20);
lbResult = new Label("여기에 결과가 출력됩니다.");
this.add(tf);
this.add(bt);
this.add(lbResult);
this.setSize(300,200);
this.setVisible(true);
//이벤트연결
/*
* 이벤트 소스 - Button
* 리스너 - ActionListener
*/
//3. 리스너로 연결
bt.addActionListener(new EventHandler());
}
//2 해당 클래스 구현
class EventHandler implements ActionListener{
@Override //1. 필요한 메서드
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();
lbResult.setText(tf.getText() + ", "+ cmd + "버튼클릭됨");
}
}
public static void main(String[] args) {
ButtonActionEvent f = new ButtonActionEvent();
}
}
2. Adapter 클래스
- 이벤트 핸들러를 작성할 때, 해당 리스너에 정의된 모든 추상메서드를 구현해야함을 개선
- 이벤트 처리에 필요한 메서드만 작성하기 위함
- 이벤트 리스너를 직접 구현하는 대신 Adapter클래스를 상속받아 원하는 메서드만 오버라이딩
- 위 예시1은 윈도우리스너를 구현하여, 메서드를 모두 오버라이딩
- Adapter 클래스 이용 시
package com.awt.day3;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class EventTest2 extends Frame {
public EventTest2() {
super("Event test");
this.setSize(300,200);
this.setVisible(true);
//이벤트연결
this.addWindowListener(new EventHandler());
}
class EventHandler extends WindowAdapter{
public void windowClosing(WindowEvent e) {
e.getWindow().dispose();
System.exit(0);
}
}
public static void main(String[] args) {
EventTest2 f = new EventTest2();
}
}
3. 이벤트핸들러 작성방법
- 내부클래스로 이벤트핸들러를 구성하는 경우
- 익명클래스로 이벤트핸들러를 구성하는 경우
- 이벤트소스를 가진 클래스가 핸들러가 되는경우
- 외부클래스로 별도의 이벤트핸들러를 구성하는 경우
a. 내부클래스로 이벤트핸들러를 구성하는 경우
package com.test;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class test extends Frame {
public test() {
super();
addWindowListener(new EventHandler());
}
class EventHandler extends WindowAdapter{
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
public static void main(String[] args) {
test f = new test();
f.setSize(300,300);
f.setVisible(true);
}
}
b. 익명클래스로 이벤트핸들러를 구성하는 경우
package com.test;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class test extends Frame {
public test() {
super();
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public static void main(String[] args) {
test f = new test();
f.setSize(300,300);
f.setVisible(true);
}
}
c. 이벤트소스를 가진 클래스가 핸들러가 되는경우
package com.test;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
public class test extends Frame implements WindowListener {
public test() {
super();
addWindowListener(this);
}
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
public static void main(String[] args) {
test f = new test();
f.setSize(300,300);
f.setVisible(true);
}
}
d. 외부클래스로 별도의 이벤트핸들러를 구성하는 경우
package com.test;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
//외부클래스
class EventHandler extends WindowAdapter{
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
public class test {
public static void main(String[] args) {
Frame f = new Frame();
f.setSize(300,300);
f.setVisible(true);
f.addWindowListener(new EventHandler());
}
}
4. 예시
카드레이아웃 이동
import java.awt.Button;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ActionCardTest extends Frame implements ActionListener {
Button btFirst, btPrev, btNext, btLast;
Panel plCard1,plCard2,plCard3,plCard4,plCard5;
Panel buttons, slide;
CardLayout cardlayout;
public ActionCardTest() {
super();
init();
addEvent();
}
private void addEvent() {
btFirst.addActionListener(this);
btPrev.addActionListener(this);
btLast.addActionListener(this);
btNext.addActionListener(this);
}
private void init() {
setSize(300,300);
slide = new Panel();
cardlayout = new CardLayout();
slide.setLayout(cardlayout);
buttons = new Panel();
buttons.setLayout(new FlowLayout());
btFirst = new Button("<<");
btPrev = new Button("<");
btNext = new Button(">");
btLast = new Button(">>");
buttons.add(btFirst);
buttons.add(btPrev);
buttons.add(btNext);
buttons.add(btLast);
plCard1 = new Panel();
plCard1.setBackground(Color.green);
plCard1.add(new Label("첫번째 페이지"));
plCard2 = new Panel();
plCard2.setBackground(Color.orange);
plCard2.add(new Label("두번째 페이지"));
plCard3 = new Panel();
plCard3.setBackground(Color.cyan);
plCard3.add(new Label("세번째 페이지"));
plCard4 = new Panel();
plCard4.setBackground(Color.pink);
plCard4.add(new Label("네번째 페이지"));
plCard5 = new Panel();
plCard5.setBackground(Color.yellow);
plCard5.add(new Label("다섯번째 페이지"));
slide.add(plCard1,"1");
slide.add(plCard2,"2");
slide.add(plCard3,"3");
slide.add(plCard4,"4");
slide.add(plCard5,"5");
add(slide);
add(buttons,"South");
cardlayout.show(slide, "1");
}
public static void main(String[] args) {
ActionCardTest f = new ActionCardTest();
f.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource()==btFirst) cardlayout.first(slide);
if(e.getSource()==btPrev) cardlayout.previous(slide);
if(e.getSource()==btNext) cardlayout.next(slide);
if(e.getSource()==btLast) cardlayout.last(slide);
}
}
- 버튼 클릭시 레이아웃 이동
Checkbox Event Test
package com.awt.day3;
import java.awt.Button;
import java.awt.Checkbox;
import java.awt.CheckboxGroup;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
class Frame43 extends Frame{
Panel p1,p2;
Label lb1,lb2,lb3,lb4;
CheckboxGroup group;
Checkbox c1,c2,c3,c4,c5,c6,c7,c8;
Button bt;
float cnt = 0;
public Frame43() {
super("CheckboxEventTest");
init();
addEvent();
}
private void addEvent() {
bt.addActionListener(new EventHandler());
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
class EventHandler implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
cnt = 0;
if(c1.getState()==true) cnt+=12.5;
if(c2.getState()==true) cnt+=12.5;
if(c3.getState()==true) cnt+=12.5;
if(c4.getState()==true) cnt+=12.5;
if(c7.getState()==true) cnt+=50;
lb4.setText("");
lb4.setText("*결과 : 당신의 점수는 "+cnt+"점 입니다.");
}
}
private void init() {
setSize(500,400);
setVisible(true);
lb1 = new Label("1. 다음중 ActionEvent의 actionPerformed메서드가 호출되는 경우는? (모두 고르세요)");
c1 = new Checkbox("Button을 눌렀을 때");
c2 = new Checkbox("TextFiled에서 Enter키를 눌렀을 때");
c3 = new Checkbox("MenuItem을 클릭했을 때");
c4 = new Checkbox("List에서 더블클릭으로 item을 선택했을 때");
lb2 = new Label("");
lb3 = new Label("2. Frame의 기본 LayoutManager는? (하나만 고르세요.)");
group = new CheckboxGroup();
c5 = new Checkbox("FlowLayout",group,false);
c6 = new Checkbox("GridLayout",group,false);
c7 = new Checkbox("BorderLayout",group,false);
c8 = new Checkbox("CardLayout",group,false);
p1 = new Panel();
p1.setLayout(new GridLayout(11,1));
p1.add(lb1);
p1.add(c1);
p1.add(c2);
p1.add(c3);
p1.add(c4);
p1.add(lb2);
p1.add(lb3);
p1.add(c5);
p1.add(c6);
p1.add(c7);
p1.add(c8);
add(p1);
bt = new Button("이 버튼을 누르시면 결과를 알 수 있습니다.");
lb4 = new Label("");
p2 = new Panel();
p2.setLayout(new GridLayout(2,1));
p2.add(bt);
p2.add(lb4);
add(p2,"South");
}
}
public class Prac_18_43 {
public static void main(String[] args) {
Frame43 f = new Frame43();
}
}
덧셈 test
import java.awt.Button;
import java.awt.Color;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
class Frame46 extends Frame{
Label lb1,lb2,lb3;
TextField tf1,tf2,tf3;
Button bt1, bt2, bt3;
public Frame46() {
super("덧셈");
init();
addEvent();
}
private void init() {
lb1 = new Label("첫번째 숫자 : ",Label.LEFT);
lb2 = new Label("두번째 숫자 : ",Label.LEFT);
lb3 = new Label("결과 : ",Label.LEFT);
tf1 = new TextField();
tf2 = new TextField();
tf3 = new TextField();
tf3.setEditable(false);
bt1 = new Button("더하기");
bt2 = new Button("화면지우기");
setSize(300,250);
setLayout(new GridLayout(4,2,10,10));
setBackground(Color.pink);
add(lb1);
add(tf1);
add(lb2);
add(tf2);
add(lb3);
add(tf3);
add(bt1);
add(bt2);
setVisible(true);
}
private void addEvent() {
bt1.addActionListener(new EventHandler());
bt2.addActionListener(new EventHandler());
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
class EventHandler implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource()==bt2) {
tf1.setText("");
tf2.setText("");
tf3.setText("");
}
if(e.getSource()==bt1) {
String rst = "";
try {
String s1 = tf1.getText();
String s2 = tf2.getText();
float f1 = Float.parseFloat(s1);
float f2 = Float.parseFloat(s2);
rst = Float.toString(f1+f2);
System.out.println("1");
}catch(NumberFormatException a) {
rst = "숫자를 입력하세요";
}
tf3.setText(rst);
}
}
}
}
public class Prac_18_46 {
public static void main(String[] args) {
Frame46 f = new Frame46();
}
}