AWT - 이벤트처리

2023. 3. 28. 10:16Lang/Java

728x90
반응형
  • 이벤트 소스 (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();

    }

}

bt1
bt2


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);    
    }
}
  • 버튼 클릭시 레이아웃 이동
    c1
    c5

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();

    }

}

te1
te2


덧셈 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();

    }

}

d1
d2

728x90
반응형

'Lang > Java' 카테고리의 다른 글

자바에서의 입출력, I/O  (0) 2023.03.28
Swing, Jtable  (1) 2023.03.28
AWT - 레이아웃 매니저  (0) 2023.03.28
AWT - 메뉴 컴포넌트  (0) 2023.03.28
AWT란  (0) 2023.03.28