Java AWT는 이전 포스트에서 말했다 싶히 Window에서 제공하는 껍데기를 가져다가 쓰는 것이다.
때문에 버튼을 누르거나 폼창을 닫으려고 해도 아무런 행동을 하지 않는다.
그것을 추가할려면 어떤 Event가 있는지 감지하는 Listener에 등록해야 특정행동을 하도록 할 수 있다.
Listener : 특정 위젯이 Event가 발생했는지 계속 듣고 있는 것

특정 리스너를 등록하고 싶다면 interface를 implement한 뒤 interface에서 제공하는 add메소드로 이벤트를 받을 위젯을 추가한다.
이벤트가 발생했을 경우 Listener interface에서 제공하는 이벤트 처리기 메소드가 호출 되는데 매개변수를 이용하여 이벤트가 어디서 일어났는지 알 수 있다.



▲이벤트 이름에 따른 Listener interface, add 메소드와 이벤트 처리기 메소드 이름


아래 코드는 TextField와 Button에 리스너를 등록하여 이벤트를 처리하는 프로그램이다.

동작 설명

종료 Button을 누르면 Form이 꺼짐
TextField에 값이 바뀌면 TextField에 글이 아래에 있는 TextArea에 한줄씩 추가되고,
엔터를 누르면 위에 있는 Label의 글이 바뀜.


1
2
3
4
5
6
7
8
public class EventMain {
 
    public static void main(String[] args) {
        MyEvent myEvnet = new MyEvent();
        myEvnet.startFrame();
    }
 
}
cs
▲EventMain.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
 
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.TextEvent;
import java.awt.event.TextListener;
 
public class MyEvent implements ActionListener,TextListener{
    private Frame mainFrame;
    private Button btnExit;
    private Label lblOutput;
    private TextField tfInput;
    private TextArea taOutList;
    public MyEvent() { //AWT 구성에 필요한 객체를 생성
        mainFrame = new Frame("객체와 리스너 실습");
        btnExit = new Button("종료");
        lblOutput= new Label("리스너가 감지한 이벤트 : ");
        tfInput = new TextField(30);
        tfInput.setText("천 / 당 / 속 / 서 / 제");
        taOutList = new TextArea("천\n속",5,50);
    }
 
    public void startFrame(){//컴포넌트 객체를 프레임에 추가 + 리스너 등록
        mainFrame.setLayout(new FlowLayout());
        mainFrame.add(lblOutput);
        mainFrame.add(tfInput);
        mainFrame.add(taOutList);
        mainFrame.add(btnExit);
        mainFrame.setSize(400300);
        mainFrame.setVisible(true);
        
        //Listener 
        btnExit.addActionListener(this);
        tfInput.addActionListener(this);
        tfInput.addTextListener(this);
        
    }
    
    @Override
    public void actionPerformed(ActionEvent e) { //액션 리스너의 핸들러 + 필요작업 작성
        String strTemp =e.getActionCommand();
        if(strTemp.equals("종료"))
        {
            System.exit(0);
        }
        else{
            lblOutput.setText(strTemp);
        }
    }
 
    @Override
    public void textValueChanged(TextEvent e) { // 텍스트 리스너의 핸들러 + 필요작업 작성
        taOutList.append("\ntextField 내용 : " +  tfInput.getText());
    }
}
 
cs

 

▲MyEvent.java


13 : ActionEvent와 TextEvent를 사용하기 때문에 각각의 interface를 implement 함.

14~18 : 사용할 위젯, Frame 변수를 선언함

19~26 : MyEvent가 객체로 생성될 때 각 위젯과 Frame도 객체로 생성.

29~35 : mainFrame에 Layout 설정과 위젯 추가, 사이즈, Visible 설정을 함

38~40 : btnExit와 tfInput를 add메소드를 이용하여 리스너 등록

44~54 : ActionEvent가 발생했을 때 이벤트 처리

57~59 : TextEvent가 발생했을 때 이벤트 처리


+ Recent posts