java.awt 패키지의 단순 컴포넌트와 이벤트 처리 학습목표 자바에서의 패키지 및 java.awt 패키지 중 단순 컴포넌트에 대해 학습한다. java.awt 패키지 중 단순 컴포넌트에서의 이벤트 처리에 대해 학습한다.
패키지의 정의와 종류 Section 01 개요(1/2) 패키지는 서로 관련된 클래스와 인터페이스의 집합을 의미하며 하나의 그룹으로 모아 사용한다. 패키지는 자바에서 제공되는 패키지와 사용자들이 정의해 사용하는 패키지로 구분한다. 자바에서는 다음과 같은 다양한 패키지를 제공한다. java.awt : 그래픽 사용자 인터페이스(GUI, Graphic User Interface)를 위한 클래스를 제공하는 패키지다. java.applet : 웹에서 수행되는 프로그램을 위한 클래스를 제공하는 패키지다. java.io : 파일, 키보드 등 입출력 기능을 위한 클래스를 제공하는 패키지다. java.lang : 기본적인 기능을 위한 클래스를 제공하는 패키지다. java.util : 유용한 유틸리티 기능을 위한 클래스를 제공하는 패키지다. java.net : 통신 기능 등을 위한 클래스를 제공하는 패키지다. java.sql : 데이터베이스 기능 등을 위한 클래스를 제공하는 패키지다. 프로그램에서 패키지에 있는 클래스를 사용하려면 먼저 import 문을 선언해야 한다. 단, java.lang 패키지인 경우에는 import 문을 생략하여 사용할 수 있다.
java.awt 패키지 이벤트 발생과 이벤트 처리 Section 01 개요(2/2) 객체의 이벤트는 사용자가 해당 객체에 특정 조작을 하면 컴퓨터로부터 발생되는 일종의 신호다. 예를 들면, 버튼을 마우스 왼쪽 버튼으로 누르는 행위, 텍스트필드 등에 키보드를 이용해 입력한 행위, 마우스 커서를 옮기는 행위, 윈도우의 크기를 조절하는 행위 등이다. 그리고 이런 행위에 의해 발생한 이벤트를 처리하기 위해 필요한 자바의 메소드나 함수를 이벤트 처리기(Event Handler)라 한다 이벤트 발생과 이벤트 처리 객체의 이벤트는 사용자가 해당 객체에 특정 조작을 하면 컴퓨터로부터 발생되는 일종의 신호다. 예를 들면, 버튼을 마우스 왼쪽 버튼으로 누르는 행위, 텍스트필드 등에 키보드를 이용해 입력한 행위, 마우스 커서를 옮기는 행위, 윈도우의 크기를 조절하는 행위 등이다. 그리고 이런 행위에 의해 발생한 이벤트를 처리하기 위해 필요한 자바의 메소드나 함수를 이벤트 처리기(Event Handler)라 한다.
단순 컴포넌트 Section 02 단순 컴포넌트 (1/5) 단순 컴포넌트란 버튼, 레이블, 텍스트필드, 텍스트 영역, 체크박스, 라디오 버튼, 리스트 메뉴, 선택 메뉴, 스크롤바, 메뉴, 이미지 캔버스 등의 요소를 갖고 있는 사용자 인터페이스다. 단순 컴포넌트 중에서 체크박스, 라디오 버튼, 리스트 메뉴, 선택 메뉴, 스크롤바, 메뉴, 이미지 캔버스 등의 사용 예는 다음과 같다. 체크 상자 라디오 버튼 프레임 또는 윈도우 컨테이너 리스트 메뉴 선택 메뉴 이미지 캔버스 스크롤 바
버튼(Button) 클래스 레이블(Label) 클래스 텍스트필드(TextField) 클래스 텍스트영역(TextArea) 클래스 Section 02 단순 컴포넌트 (2/5) 버튼(Button) 클래스 버튼(Button) 클래스는 버튼을 만들기 위해 사용한다. 레이블(Label) 클래스 레이블(Label) 클래스는 레이블을 만들기 위해 사용한다. 레이블(Label) 클래스는 화면에 문자 등을 출력할 수 있고 이벤트를 적용할 수 없다. 텍스트필드(TextField) 클래스 텍스트필드(TextField) 클래스는 한줄 내에서 문자열을 입력 또는 편집하거나 보여줄 때 사용한다. 텍스트영역(TextArea) 클래스 텍스트영역(TextArea) 클래스는 여러 줄 내에서 문자열을 입력 또는 편집, 보여줄 때 사용한다.
[실습하기 7-1] AWT의 버튼(Button), 레이블(Label), 텍스트필드 (TextField) 및 텍스트영역(TextArea) 클래스를 사용 (1/9)
[실습하기 7-1] AWT의 버튼(Button), 레이블(Label), 텍스트필드 (TextField) 및 텍스트영역(TextArea) 클래스를 사용 (2/9) 01 import java.awt.*; 02 03 public class Jv_7_1 { 04 05 private Frame f; 06 private Label lb, lb0, lb1, lb2, lb3, lb4, lb5; 07 private Label lb6, lb7; 08 private Button bt0, bt1, bt2, bt3, bt4, bt5; 09 private TextField t; 10 private TextArea ta1, ta2; 11 12 int m=0, n=0; 13 int i=0, j=0; 14 15 public Jv_7_1() { 16 f = new Frame("AWT(Abstract Window Toolkit)에 온 것을 환영합니다!"); 17 18 lb = new Label("당신이 좋아하는 지명을 선택하세요?"); 19 20 lb1 = new Label("천안 버튼:"); 21 bt1 = new Button("천안"); 22 Jv_7_1.java
[실습하기 7-1] AWT의 버튼(Button), 레이블(Label), 텍스트필드 (TextField) 및 텍스트영역(TextArea) 클래스를 사용 (3/9) 23 lb2 = new Label("당진 버튼:", Label.LEFT); 24 lb2.setBackground(Color.red); 25 bt2 = new Button("당진"); 26 bt2.setBackground(Color.red); 27 28 lb3 = new Label("속초 버튼:", Label.CENTER); 29 lb3.setBackground(Color.green); 30 bt3 = new Button("속초"); 31 bt3.setBackground(Color.green); 32 33 lb4 = new Label("서울 버튼:", Label.RIGHT); 34 lb4.setBackground(Color.blue); 35 bt4 = new Button("서울"); 36 bt4.setBackground(Color.blue); 37 38 lb5 = new Label("제주 버튼:"); 39 lb5.setBackground(Color.yellow); 40 bt5 = new Button("제주"); 41 bt5.setBackground(Color.yellow); 42 43 t = new TextField(30); 44 t.setText("천안 / 당진 / 속초 / 서울 / 제주"); Jv_7_1.java
[실습하기 7-1] AWT의 버튼(Button), 레이블(Label), 텍스트필드 (TextField) 및 텍스트영역(TextArea) 클래스를 사용 (4/9) 45 t.setBackground(Color.green); 46 47 ta1 = new TextArea("천안\n속초", 3, 20); 48 ta2 = new TextArea("천안\n속초\n서울 \n제주", 5, 20); 49 m = ta1.getRows(); n = ta1.getColumns(); 50 lb6 = new Label("1st텍스트영역(줄:" + m + " 열:" + n +")"); 51 lb6.setBackground(Color.green); 52 i = ta2.getRows(); j = ta2.getColumns(); 53 lb7 = new Label("2nd텍스트영역(줄:" + i + " 열:" + j +")"); 54 lb7.setBackground(Color.yellow); 55 } 56 57 public void startFrame() { 58 f.setLayout(new FlowLayout()); 59 60 f.add(lb); 61 62 f.add(lb1); 63 f.add(bt1); 64 65 f.add(lb2); 66 f.add(bt2); Jv_7_1.java
[실습하기 7-1] AWT의 버튼(Button), 레이블(Label), 텍스트필드 (TextField) 및 텍스트영역(TextArea) 클래스를 사용 (5/9) 67 68 f.add(lb3); 69 f.add(bt3); 70 71 f.add(lb4); 72 f.add(bt4); 73 74 f.add(lb5); 75 f.add(bt5); 76 77 f.add(t); 78 79 f.add(lb6); 80 f.add(ta1); 81 f.add(lb7); 82 f.add(ta2); 83 84 f.setSize(500,300); 85 f.setVisible(true); 86 } 87 Jv_7_1.java
[실습하기 7-1] AWT의 버튼(Button), 레이블(Label), 텍스트필드 (TextField) 및 텍스트영역(TextArea) 클래스를 사용 (6/9) 88 public static void main(String[] args) { 89 Jv_7_1 kkk = new Jv_7_1(); 90 kkk.startFrame(); 91 } 92 } Jv_7_1.java
[실습하기 7-1] AWT의 버튼(Button), 레이블(Label), 텍스트필드 (TextField) 및 텍스트영역(TextArea) 클래스를 사용 (7/9) 01행: AWT(Abstract Window Toolkit)와 연관된 클래스를 사용하기 위해 java.awt 패키지를 포함시키기 위해 import한다. 03~92행: 클래스 Jv_7_1를 선언한다. 05행: Frame 클래스의 객체 변수를 선언한다. 06~07행: 레이블 객체를 선언한다. 08행: 버튼 객체를 선언한다. 09행: 텍스트필드 객체를 선언한다. 10행: 텍스트 영역 객체를 선언한다. 15~55행: Jv_7_1() 클래스의 생성자를 선언한다. 16행: Jv_7_1() 클래스의 생성자 안에 Frame 클래스의 객체를 생성하며 기본윈도우가 만들어진다. 이 윈도우는 경계선과 타이틀 바를 갖고 있는 윈도우다. 18, 20, 23, 28, 33, 38, 50, 53행: 생성자 내에서 문자열을 가진 레이블을 생성한다. 예를 들면, Label lb1 = new Label("컴퓨터학");에 의해서 "컴퓨터학"이란 문자열을 가진 레이블 1개를 생성한다. - Label.LEFT: 왼쪽으로 정렬된 문자열을 포함한 레이블을 생성한다. - Label.RIGHT: 오른쪽으로 정렬된 문자열을 포함한 레이블을 생성한다. - Label.CENTER: 가운데로 정렬된 문자열을 포함한 레이블을 생성한다. 프로그램 구조 설명
[실습하기 7-1] AWT의 버튼(Button), 레이블(Label), 텍스트필드 (TextField) 및 텍스트영역(TextArea) 클래스를 사용 (8/9) 24, 29, 34, 39, 51, 54행: 레이블의 배경색을 지정하는 메소드다. 예를 들면, lb2.setBackground(Color.red);에서는 lb2에 의해 생성된 레이블의 배경색을 지정하는 setBackground() 메소드이며, 여기서는 붉은색을 지정하고 있다. 21, 25, 30, 35, 40행: 생성자 내에서 문자열이 있는 버튼을 생성한다. 26, 31, 36, 41행: 버튼의 배경색을 지정하는 메소드다. 43행: 30이라고 지정한 문자 수 만큼 들어갈 수 있는 비어 있는 텍스트필드를 생성한다. 44행: 텍스트필드에 “천안 / 당진 / 속초 / 서울 / 제주” 문자열로 지정한다. 45행: 텍스트필드의 배경색을 지정하는 메소드다. 47행: TextArea 클래스로부터 새로운 텍스트 영역 컴포넌트를 생성한다. 숫자 3, 20은 각각 3행 20열을 의미하며, \n은 줄바꾸기(return)을 의미한다. 48행: TextArea 클래스로부터 새로운 텍스트 영역 컴포넌트를 생성한다. 숫자 5, 20은 각각 5행 20열을 의미하며, \n은 줄바꾸기(return)을 의미한다. 49행: m = ta1.getRows();은 ta1으로 생성된 텍스트 영역에서 텍스트 영역의 줄 수를 반환하여 m에 저장한다. n = ta1.getColumns();은 ta1으로 생성된 텍스트 영역에서 텍스트 영역의 열 수를 반환하여 n에 저장한다. 프로그램 구조 설명
[실습하기 7-1] AWT의 버튼(Button), 레이블(Label), 텍스트필드 (TextField) 및 텍스트영역(TextArea) 클래스를 사용 (9/9) 57~86행: 객체 생성자 내에 있는 메소드다. 58행: 레이아웃을 설정하는 데 사용하고, new FlowLayout()에 의해 수평 방향으로 배치한다. 프레임 내에서의 컴포넌트의 배치 방식은 FlowLayout이라는 의미이다. 즉, 왼쪽에서 오른쪽으로 배치하고 한줄이 넘치면 다음 줄로 넘어가서 새줄로 시작하여 차례대로 배치하는 방식이다. <<다음 장>>에서 자세히 서술한다. 60, 62, 65, 68, 71, 74, 79, 81행: add() 메소드를 사용해 레이블 객체를 프레임에 추가한다. 63, 66, 69, 72, 75행: 버튼 객체를 add() 메소드를 사용해 프레임에 추가한다. 77행: 텍스트필드 객체를 add() 메소드를 사용해 프레임에 추가한다. 80, 82행: 텍스트 영역 객체를 add() 메소드를 사용해 프레임에 추가한다. 84행: 프레임의 크기를 가로 500픽셀, 세로 300픽셀로 setSize() 메소드를 사용해 지정한다. 85행: setVisible() 메소드에 true 값을 설정하면 프레임 화면을 보이게 한다. 만일 false 값을 설정하면 프레임 화면이 보이지 않게 된다. 88, 91행: main() 메소드의 선언부이다. 89행: Jv_7_1 객체를 생성한다. 90행: Jv_7_1 객체를 생성한 후에 startFrame(); 메소드를 호출하여 화면에 윈도우를 출력시킨다. 프로그램 구조 설명
체크박스(Check Box) 클래스 Section 02 단순 컴포넌트 (3/5) 체크박스(Check Box) 클래스의 종류에는 2가지 종류의 형태가 있다. 정사각형에 체크 표시가 나타나는 체크박스(Check Box)와 원안에 점이 나타나는 라디오 버튼(Radio Button)이다. 체크박스(Check Box) : 체크박스에 마우스로 한번 클릭하면 정사각형에 ‘√’ 표시(상태는 참인 on)가 되고, 또 다시 클릭하면 정사각형에 ‘√’ 표시(상태가 거짓인 off)가 없어진다. 즉, 클릭할 때마다 참/거짓 상태가 번갈아 바뀌는 토글(toggle)이 된다. 동시에 여러 개의 항목을 선택할 수 있다. 라디오 버튼(Radio Button) : 라디오 버튼에 마우스로 한번 클릭하면 원 안에 ‘◉ 표시(상태는 참인 on)가 되고, 또 다시 클릭하면 원 안에 ‘●’ 표시(상태가 거짓인 off)가 없어진다. 즉, 클릭할 때마다 참/거짓 상태가 번갈아 바뀌는 토글(toggle)이 된다. 동시에 여러 개의 항목을 선택할 수 있고 반드시 한 개의 항목만을 선택할 수 있다. 라디오 버튼을 사용하려면 여러 개의 라디오 버튼을 한 개의 그룹으로 묶어서 그 중 하나를 선택해야 한다. 그룹을 만들기 위해 CheckboxGroup 클래스를 사용한다
리스트(List) 클래스 초이스(Choice) 클래스 스크롤바(ScrollBar) 클래스 Section 02 단순 컴포넌트 (4/5) 리스트(List) 클래스 다수의 선택 항목이 리스트에 표시되며, 사용자가 이를 선택할 때 사용한다. 선택 항목이 많을 때는 수직 스크롤바가 표시된다. 원하는 선택 항목을 한개 또는 동시에 여러 개 선택 가능하다. 초이스(Choice) 클래스 초이스(Choice) 클래스는 리스트 컴포넌트와 비슷하지만, 차이점은 리스트에 한 개의 선택 항목만이 표시되며, 항목 옆의 단추를 클릭하면 드롭 다운(drop-down) 리스트를 제공한다. 제한된 공간에서 많은 선택 항목을 나타낼 때 유용하다 스크롤바(ScrollBar) 클래스 스크롤바(ScrollBar) 클래스는 스크롤바를 만들기 위해 사용한다. 스크롤바에는 수직 스크롤바와 수평 스크롤바를 만들 수 있으며, 디폴트(default)로는 수직 스크롤바를 지원한다
이미지 캔버스(Image Canvas) 클래스 Section 02 단순 컴포넌트 (5/5) 이미지 캔버스(Image Canvas) 클래스 이미지 캔버스(Image Canvas) 클래스는 특정한 모양은 없으나 이미지 파일을 읽어 보여주거나 선, 원, 그래픽 요소를 그릴 수 있는 그래픽 작업 영역을 제공한다.
[실습하기 7-2] AWT의 체크박스와 라디오 버튼, 리스트와 초이스, 수직 및 수평 스크롤바, 이미지 캔버스를 사용 (1/8)
[실습하기 7-2] AWT의 체크박스와 라디오 버튼, 리스트와 초이스, 수직 및 수평 스크롤바, 이미지 캔버스를 사용 (2/8) 01 import java.awt.*; 02 public class Jv_7_2 extends Frame { 03 CheckboxGroup cbg; 04 Label label1, label2, label3; 05 Scrollbar vSlider, hSlider; 06 Canvas imgCanvas; 07 08 public Jv_7_2() { 09 super("단순 컴포넌트 - 체크박스와 라디오버튼 /리스트와 초이스 /수직 및 수평 스크롤바 / 이미지 캔버스"); 10 setLayout(new FlowLayout()); 11 12 add(new Checkbox("천안")); 13 add(new Checkbox("당진")); 14 add(new Checkbox("속초")); 15 add(new Checkbox("서울")); 16 add(new Checkbox("제주")); 17 cbg = new CheckboxGroup(); 18 add(new Checkbox("천안", cbg, false)); 19 add(new Checkbox("당진", cbg, false)); 20 add(new Checkbox("속초", cbg, true)); 21 add(new Checkbox("서울", cbg, false)); 22 add(new Checkbox("제주", cbg, false)); Jv_7_2.java
[실습하기 7-2] AWT의 체크박스와 라디오 버튼, 리스트와 초이스, 수직 및 수평 스크롤바, 이미지 캔버스를 사용 (3/8) 23 24 List list = new List(3, false); 25 list.add("천안"); 26 list.add("당진"); 27 list.add("속초"); 28 list.add("서울"); 29 list.add("제주"); 30 add(list); 31 Choice choice = new Choice(); 32 choice.add("천안"); 33 choice.add("당진"); 34 choice.add("속초"); 35 choice.add("서울"); 36 choice.add("제주"); 37 add(choice); 38 39 label1 = new Label("수직 스크롤바: ", Label.CENTER); 40 label2 = new Label("수평 스크롤바: ", Label.CENTER); 41 42 vSlider = new Scrollbar(Scrollbar.VERTICAL, 0,1,0,100); 43 hSlider = new Scrollbar(Scrollbar.HORIZONTAL, 0,4,0,50); 44 Jv_7_2.java
[실습하기 7-2] AWT의 체크박스와 라디오 버튼, 리스트와 초이스, 수직 및 수평 스크롤바, 이미지 캔버스를 사용 (4/8) 45 add(label1); 46 add(vSlider); 47 add(label2); 48 add(hSlider); 49 50 label3 = new Label("이미지 캔버스: ", Label.CENTER); 51 imgCanvas = new Canvas(); 52 imgCanvas.setBackground(Color.yellow); 53 imgCanvas.setSize(200,150); 54 add(label3); 55 add(imgCanvas); 56 57 setSize(600, 300); 58 setVisible(true); 59 } 60 61 public static void main(String[] args) { 62 Jv_7_2 c1 = new Jv_7_2(); 63 } 64 } Jv_7_2.java
[실습하기 7-2] AWT의 체크박스와 라디오 버튼, 리스트와 초이스, 수직 및 수평 스크롤바, 이미지 캔버스를 사용 (5/8) 01행: AWT(Abstract Window Toolkit)와 연관된 클래스를 사용하기 위해 java.awt 패키지를 포함시키기 위해 import한다. 02~64행: 클래스 Jv_7_2를 선언한다. extends Frame를 사용해 Frame 클래스로부터 상속받는 클래스다. 03행: 라디오버튼을 만들기 위해 체크박스 그룹 객체를 선언한다. 04행: 레이블 객체를 선언한다. 05행: 스크롤바 객체를 선언한다. 06행: 이미지 캔버스 겍체를 선언한다. 08~59행: Jv_7_2() 클래스의 생성자를 선언한다. 09행: super() 메소드, 즉 Frame 클래스의 생성자를 통해 "단순 컴포넌트 - 체크박스와 라디오버튼 /리스트와 초이스/수직 및 수평 스크롤바 / 이미지 캔버스"이라는 제목을 갖는 Frame을 생성한다. 10행: setLayout은 레이아웃을 설정하는 데 사용하고, new FlowLayout()에 의해 수평 방향으로 배치한다. 프레임 내에서의 컴포넌트의 배치 방식은 FlowLayout이라는 의미이다. 즉, 왼쪽에서 오른쪽으로 배치하고 한 줄이 넘치면 다음 줄로 넘어가서 새 줄로 시작하여 차례대로 배치하는 방식이다 프로그램 구조 설명
[실습하기 7-2] AWT의 체크박스와 라디오 버튼, 리스트와 초이스, 수직 및 수평 스크롤바, 이미지 캔버스를 사용 (6/8) 12~16행: Checkbox 객체를 선언하며, add() 메소드를 이용해 컨테이너에 추가시킨다. 17행: 라디오버튼을 만들기 위해 체크박스 그룹 객체를 생성한다. 18~22행: 라디오버튼을 만들기 위해 체크박스를 cbg에 그룹화하여 생성한다. 예를 들면, add(new Checkbox("천안", cbg, false));에서 체크박스에 "천안"이라는 이름을 부여하면서 초기 선택값으로 false를 주어 미리 선택이 되지 않도록 한다. add(new Checkbox("속초", cbg, true));에서 체크박스에 "속초"이라는 이름을 부여하면서 초기 선택값으로 true를 주어 미리 선택이 되도록 한다. 24행: 리스트에 있는 항목이 3줄씩 보이게 하며, false에 의해서 여러 개의 항목을 동시에 선택 불가능하게 한다. 만일 true이면 여러 개의 항목을 동시에 선택 가능하게 한다. 25~29행: 주어진 이름의 항목을 해당 리스트에 추가한다. 30행: 생성된 리스트 객체를 add() 메소드를 이용해 컨테이너에 추가시킨다. 31행: 선택(Choice) 객체를 선언한 후에 객체를 생성한다. 프로그램 구조 설명
[실습하기 7-2] AWT의 체크박스와 라디오 버튼, 리스트와 초이스, 수직 및 수평 스크롤바, 이미지 캔버스를 사용 (7/8) 32~36행: 주어진 이름의 항목을 해당 선택(Choice) 컴포넌트에 추가한다. 37행: 생성된 선택(Choice) 객체를 add() 메소드를 이용해 컨테이너에 추가시킨다. 39~40행: 생성자 내에서 문자열을 가진 레이블을 생성한다. 예를 들면, Label lb1 = new Label("컴퓨터학");에 의해서 "컴퓨터학"이란 문자열을 가진 레이블 1개를 생성한다. 42행: 최소값 0, 최대값 100, 초기값이 0, 스크롤바의 두께가 1 픽셀인 수직 스크롤바를 생성한다. 43행: 최소값 0, 최대값 50, 초기값이 0, 스크롤바의 두께가 4 픽셀인 수평 스크롤바를 생성한다. 45, 47행: add() 메소드를 사용해 레이블 객체를 프레임에 추가한다. 46, 48행: add() 메소드를 사용해 스크롤바 객체를 프레임에 추가한다. 50행: 생성자 내에서 이미지 캔버스: "라는 가운데로 정렬된 문자열을 가진 레이블을 생성한다. 프로그램 구조 설명
[실습하기 7-2] AWT의 체크박스와 라디오 버튼, 리스트와 초이스, 수직 및 수평 스크롤바, 이미지 캔버스를 사용 (8/8) 52행: 이미지 캔버스의 배경색을 노란색으로 지정한다. 53행: 이미지 캔버스의 크기를 가로 200 픽셀, 세로 150 픽셀로 지정한다. 54행: 생성된 레이블 객체를 add() 메소드를 이용해 컨테이너에 추가시킨다. 55행: 생성된 이미지 캔버스 객체를 add() 메소드를 이용해 컨테이너에 추가시킨다. 57행: 프레임의 크기를 가로 600픽셀, 세로 300픽셀로 setSize() 메소드를 사용해 지정한다. 58행: setVisible() 메소드에 true 값을 설정하면 프레임 화면을 보이게 한다. 만일 false 값을 설정하면 프레임 화면이 보이지 않게 된다. 51행: 이미지 캔버스 컴포넌트를 생성한다. 61, 63행: main() 메소드의 선언부다. 62행: Jv_7_2 객체를 생성한다. 프로그램 구조 설명
이벤트와 이벤트 처리기의 개념 이벤트 처리 과정과 위임형 이벤트 모델 Section 03 이벤트 처리 (1/8) 이벤트(Event)란 프로그램에서 사용자로부터 프로그램에게 어떠한 일이 발생했다는 것을 알리는 통신 수단이다. 즉, 객체의 이벤트란 사용자가 외부 세계로부터 해당 객체에 특정 조작을 하면 컴퓨터로부터 발생되는 일종의 신호를 말한다. 예를 들면, 버튼 위에서 마우스 커서를 위치한 상태에서 마우스의 왼쪽 버튼을 누른 행위, 사용자가 텍스트필드 등에서 키보드로 입력한 행위, 마우스 커서를 이동시키는 행위, 윈도우의 크기를 변화시키는 행위 등이다. 그리고 이 때 발생한 이벤트를 처리하기 위해 필요한 자바 메소드나 함수를 이벤트 처리기(Event Handler)라 한다 이벤트 처리 과정과 위임형 이벤트 모델 이벤트가 발생하면 해당 이벤트 처리기에서 선언된 자바 언어의 메소드가 호출되어 처리한다.
이벤트 처리 과정과 위임형 이벤트 모델 Section 03 이벤트 처리 (2/8) 예를 들면, 왼쪽 그림처럼 윈도우 메시지 창에 포함된 버튼 컴포넌트를 클릭해 이벤트를 발생시키면, 마우스 클릭 이벤트가 처리되어 오른쪽 그림처럼 파일 대화상자가 열린다. 즉, 하나의 이벤트는 이벤트를 발생시키는 버튼이라는 소스 객체로부터 이벤트를 기다리는 리스너 객체로 전달된다. 버튼이라는 소스 객체에서 이벤트가 발생하면 리스너 객체의 지정된 메소드를 호출한다. 이 때 발생된 이벤트의 유형을 정의하는 클래스의 인스턴스가 매개변수로 넘겨지는데 이러한 이벤트 처리 모델을 위임형 이벤트 모델(Delegation Event Model)이라 한다.
이벤트 처리 프로그램 과정의 예 이벤트의 종류 Section 03 이벤트 처리 (3/8) 이벤트 관련 패키지를 import한다. 발생한 이벤트가 처리되기 위해 인터페이스를 통해 클래스를 생성한다. 버튼 객체처럼 컴포넌트 객체를 생성한 후에 해당 객체에 이벤트를 접수 할 수 있도록 해당 리스너를 등록한다. 리스너 인터페이스의 메소드 들을 구현한다 이벤트의 종류 이벤트는 크게 의미적 이벤트(Semantic Event)와 저수준 이벤트(Low Level Event)로 분류한다. 의미적 이벤트는 특정 컴포넌트에 의해 만들어지는 고수준 이벤트다. 저수준 이벤트는 마우스 누름, 키 누름, 마우스 이동 포커스 변화 등 사용자 입력이나 시스템 수준에서 발생하고 처리 방법은 비슷하다.
이벤트의 종류 Section 03 이벤트 처리 (4/8) 분류 이벤트 명 이벤트 발생하는 경우 소스 객체 의미적 이벤트 소스 객체 의미적 이벤트 ActionEvent 단순 컴포넌트에서의 특유한 동작에 의해 발생 예) - 버튼: 마우스의 클릭한 경우 - 텍스트필드: 엔터 키를 입력한 경이 우 - 리스트: 아이템 선택을 한 경우 - 메뉴아이템: 메뉴를 마우스로 클 릭하거나 키보드로 엔터키 를 눌렀을 경우 Button, Textfield, List, Menuitem TextEvent 텍스트필드나 텍스트 영역의 텍스트를 변경하는 경우 Textfield, Textarea ItemEvent 체크박스, 라디오 버튼, 리스트, 초이스처럼 선택 항목을 갖는 컴포넌트에서 어떤 항목을 선택한 경우 Checkbox, List, Choice AdjustmentEvent 수직 또는 수평 스크롤바의 값이 변경된 경우 Scrollbar 저수준 MouseEvent 마우스 버튼이 클릭된 경우, 또는 마우스가 객체의 영역으로 들어오거나 나갈 경우 Component MouseMotionEvent 마우스가 움직일 경우 KeyEvent 사용자가 키를 눌렀을 때 키보드 포커스를 가지고 있는 객체인 경우 WindowEvent 윈도우의 열림, 닫힘, 아이콘화처럼 윈도우의 변화가 있을 경우 Frame, Dialog FocusEvent 키보드 입력을 받을 수 있는 상태가 되었을 경우, 또는 그 반대의 경우 ComponentEvent 컴포넌트의 크기나 위치가 변하는 경우 ContainerEvent 컨테이너 객체에 컴포넌트가 추가 또는 삭제되는 경우 Container
각 이벤트 종류별 리스너, add 메소드, 이벤트 처리기 메소드 Section 03 이벤트 처리 (5/8) 각 이벤트 종류별 리스너, add 메소드, 이벤트 처리기 메소드 이벤트 명이벤트 명 리스너 add 메소메소드 이벤트 처리기 메소드 (interface 메소드) ActionEvent ActionListener addActionListener() actionPerformed(ActionEvent e) TextEvent TextListener addTextListener() textValueChanged(TextEvent e) ItemEvent ItemListener addItemListener() itemStateChanged(ItemEvent e) AdjustmentEvent AdjustmentListener addAdjustmentListener() adjustmentValueChanged(AdjustmentEvent e) MouseEvent MouseListener addMouseListener() mouseClicked(MouseEvent e) mouseEntered(MouseEvent e) mouseExited(MouseEvent e) mousePressed(MouseEvent e) mouseReleased(MouseEvent e) MouseMotionEvent MouseMotionListener addMouseMotionListener() mouseDragged(MouseEvent e) mouseMoved(MouseEvent e) KeyEvent KeyListener addKeyListener() KeyPressed(KeyEvent e) KeyReleased(KeyEvent e) KeyTyped(KeyEvent e)
각 이벤트 종류별 리스너, add 메소드, 이벤트 처리기 메소드 Section 03 이벤트 처리 (6/8) 각 이벤트 종류별 리스너, add 메소드, 이벤트 처리기 메소드 이벤트 명이벤트 명 리스너 add 메소메소드 이벤트 처리기 메소드 (interface 메소드) WindowEvent WindowListener addWindowListener() windowActivated(WindowEvent e) windowClosed(WindowEvent e) windowClosing(WindowEvent e) windowDeactivated(WindowEvent e) windowDeiconified(WindowEvent e) windowIconified(WindowEvent e) windowOpened(WindowEvent e) FocusEvent FocusListener addFocusListener focusGained(FocusEvent e) focusLost(FocusEvent e) ComponentEvent ComponentListener addComponentListener() componentHidden(ComponentEvent e) componentMoved(ComponentEvent e) componentResized(ComponentEvent e) componentShown(ComponentEvent e) ContainerEvent ContainerListener addListener() componentAdded(ComponentEvent e) componentRemoved(ComponentEvent e)
이벤트와 컴포넌트와의 관계 Section 03 이벤트 처리 (7/8) 이벤트 명 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ActionEvent ● TextEvent ItemEvent AdjustmentEvent MouseEvent MouseMotionEvent KeyEvent WindowEvent FocusEvent ComponentEvent ContainerEvent ( 1: Button, 2: Label, 3: Choice, 4: List, 5: Checkbox, 6: CheckboxMenuItem, 7:Scrollbar, 8:ScrollPane, 9: TextField, 10:TextArea, 11: Textcomponent, 12: Canvas, 13: MenuItem, 14: Component, 15: Container, 16: Frame, 17: Panel 18: Dialog, 19: Window )
이벤트 클래스의 계층 구조 Section 03 이벤트 처리 (8/8) java.awt.EventObject java.awt.AWTEvent java.awt.event.ActionEvent java.awt.event.TextEvent java.awt.event.ItemEvent java.awt.event.AdjustmentEvent java.awt.event.ComponentEvent java.awt.event.ContainerEvent java.awt.event.WindowEvent java.awt.event.FocusEvent java.awt.event.InputEvent java.awt.event.KeyEvent java.awt.event.MouseEvent
[실습하기 7-3] AWT의 버튼 클래스, 레이블 클래스, 텍스트필드) 및 텍스트 영역 클래스에서 의미적(symantic) 이벤트 처리 (1/9)
[실습하기 7-3] AWT의 버튼 클래스, 레이블 클래스, 텍스트필드) 및 텍스트 영역 클래스에서 의미적(symantic) 이벤트 처리 (2/9) 001 import java.awt.*; 002 import java.awt.event.*; 003 004 public class Jv_7_3 implements ActionListener, TextListener { 005 006 private Frame f; 007 private Label lb, lb0, lb1, lb2, lb3, lb4, lb5; 008 private Label lb6, lb7, label1, label2, label3; 009 private Button bt0, bt1, bt2, bt3, bt4, bt5; 010 private TextField t; 011 private TextArea ta1, ta2; 012 int m=0, n=0; 013 int i=0, j=0; 014 015 public Jv_7_3() { 016 f = new Frame("AWT(Abstract Window Toolkit)에 온 것을 환영 합니다!"); 017 018 lb = new Label("당신이 좋아하는 지명을 선택하세요?"); 019 020 lb1 = new Label("천안 버튼:"); 021 bt1 = new Button("천안"); 022 Jv_7_3.java
[실습하기 7-3] AWT의 버튼 클래스, 레이블 클래스, 텍스트필드) 및 텍스트 영역 클래스에서 의미적(symantic) 이벤트 처리 (3/9) 023 lb2 = new Label("당진 버튼:", Label.LEFT); 024 lb2.setBackground(Color.red); 025 bt2 = new Button("당진"); 026 bt2.setBackground(Color.red); 027 028 lb3 = new Label("속초 버튼:", Label.CENTER); 029 lb3.setBackground(Color.green); 030 bt3 = new Button("속초"); 031 bt3.setBackground(Color.green); 032 033 lb4 = new Label("서울 버튼:", Label.RIGHT); 034 lb4.setBackground(Color.blue); 035 bt4 = new Button("서울"); 036 bt4.setBackground(Color.blue); 037 038 lb5 = new Label("제주 버튼:"); 039 lb5.setBackground(Color.yellow); 040 bt5 = new Button("제주"); 041 bt5.setBackground(Color.yellow); 042 043 label3 = new Label("당신이 좋아하는 지명을 입력하세요?"); 044 t = new TextField(30); Jv_7_3.java
[실습하기 7-3] AWT의 버튼 클래스, 레이블 클래스, 텍스트필드) 및 텍스트 영역 클래스에서 의미적(symantic) 이벤트 처리 (4/9) 045 t.setText("천안 / 당진 / 속초 / 서울 / 제주"); 046 t.setBackground(Color.green); 047 048 ta1 = new TextArea("천안\n속초", 3, 20); 049 ta2 = new TextArea("천안\n속초\n서울 \n제주", 5, 20); 050 m = ta1.getRows(); n = ta1.getColumns(); 051 lb6 = new Label("1st텍스트영역(줄:" + m + " 열:" + n +")"); 052 lb6.setBackground(Color.green); 053 i = ta2.getRows(); j = ta2.getColumns(); 054 lb7 = new Label("2nd텍스트영역(줄:" + i + " 열:" + j +")"); 055 lb7.setBackground(Color.yellow); 056 057 label1 = new Label("선택 결과==>"); 058 label1.setBackground(Color.green); 059 label2 = new Label(" "); 060 label2.setBackground(Color.green); 061 lb0 = new Label("종료 버튼:"); 062 bt0 = new Button("종료"); 063 } 064 065 public void startFrame() { 066 Jv_7_3.java
[실습하기 7-3] AWT의 버튼 클래스, 레이블 클래스, 텍스트필드) 및 텍스트 영역 클래스에서 의미적(symantic) 이벤트 처리 (5/9) 067 f.setLayout(new FlowLayout()); 068 069 f.add(lb); 070 071 f.add(lb1); 072 f.add(bt1); 073 074 f.add(lb2); 075 f.add(bt2); 076 077 f.add(lb3); 078 f.add(bt3); 079 080 f.add(lb4); 081 f.add(bt4); 082 083 f.add(lb5); 084 f.add(bt5); 085 086 f.add(label3); 087 f.add(t); 088 f.add(lb6); Jv_7_3.java
[실습하기 7-3] AWT의 버튼 클래스, 레이블 클래스, 텍스트필드) 및 텍스트 영역 클래스에서 의미적(symantic) 이벤트 처리 (6/9) 089 f.add(ta1); 090 f.add(lb7); 091 f.add(ta2); 092 093 094 f.add(label1); 095 f.add(label2); 096 f.add(lb0); 097 f.add(bt0); 098 099 f.setSize(300,500); 100 f.setVisible(true); 101 102 bt0.addActionListener(this); 103 bt1.addActionListener(this); 104 bt2.addActionListener(this); 105 bt3.addActionListener(this); 106 bt4.addActionListener(this); 107 bt5.addActionListener(this); 108 t.addActionListener(this); 109 t.addTextListener(this); 110 } Jv_7_3.java
[실습하기 7-3] AWT의 버튼 클래스, 레이블 클래스, 텍스트필드) 및 텍스트 영역 클래스에서 의미적(symantic) 이벤트 처리 (7/9) 111 112 public static void main(String[] args) { 113 Jv_7_3 kkk = new Jv_7_3(); 114 kkk.startFrame(); 115 } 116 117 public void actionPerformed(ActionEvent evt) { 118 String str = evt.getActionCommand(); 119 if (str.equals("종료")) { 120 System.exit(0); 121 } 122 else { 123 label2.setText(evt.getActionCommand()); 124 } 125 } 126 127 public void textValueChanged(TextEvent tevt) { 128 ta1.append("textfield 내용: " + t.getText() + "\n"); 129 ta2.append("textfield 내용: " + t.getText() + "\n"); 130 } 131 } Jv_7_3.java
[실습하기 7-3] AWT의 버튼 클래스, 레이블 클래스, 텍스트필드) 및 텍스트 영역 클래스에서 의미적(symantic) 이벤트 처리 (8/9) 002행: AWT(Abstract Window Toolkit) 이벤트와 연관된 클래스를 사용하기 위해 java.awt.event.* 패키지를 포함시키기 위해 import한다. 004행: ActionListener는 의미적(symantic) 이벤트 중의 하나인 액션 이벤트(ActionEvent)를 처리하기 위해 사용되는 인터페이스(interface)이다. TextListener는 의미적(symantic) 이벤트 중의 하나인 텍스트 이벤트(TextEvent)를 처리하기 위해 사용되는 인터페이스다. 102~108행: 버튼을 누를 때 이벤트(event)가 발생하도록 객체 버튼에 액션리스너(ActionListener)를 등록한다. this는 현재의 객체를 가리킨다. 예를 들면, bt0 = new Button("종료");에 의해 bt0 버튼을 생성하고, bt0.addActionListener(this);에 의해 bt0 버튼을 누를 때 이벤 트(vent)가 발생하도록 bt0 객체 버튼에 액션리스너(ActionListener)를 등록한다. 예를 들면, t = new TextField(30);에 의해 t 텍스트필드를 생성하고, t.addActionListener(this);에 의해 t 텍스트필드에 내용을 입력했을 때 이벤트(vent)가 발생하도록 t 텍스트필드 객체에 액션 리스너(ActionListener)를 등록한다. 117~125행: 이벤트가 발생하면 이벤트 처리를 위해 actionPerformed 메소드를 구현한다. actionPerformed 메소드는 ActionListener 인터페이스 내에 이미 정의가 되어 있다 프로그램 구조 설명
[실습하기 7-3] AWT의 버튼 클래스, 레이블 클래스, 텍스트필드) 및 텍스트 영역 클래스에서 의미적(symantic) 이벤트 처리 (9/9) 118행: ActionEvent 클래스의 getActionCommand() 메소드를 이용하면 이벤트를 발생시킨 컴포넌트와 관련된 문자열을 식별한다. 여기서는 버튼의 이름을 얻을 수 있다. 119행: 버튼의 이름이 “종료”와 같은지를 묻는 if문이다. 120~121행: 버튼의 이름이 “종료”와 같으면 수행하는 과정이다. System.exit(0);는 System 클래스의 exit() 메소드를 호출하는 것이며, 자바 애플리케이션을 종료시킨다. 122~124행: 버튼의 이름이 “종료”와 같지 않으면 수행하는 과정이다. ActionEvent 클래스의 getActionCommand() 메소드를 이용하면 버튼의 이름을 얻어서 label2 객체의 버튼에 텍스트로 표시한다. 109행: 텍스트의 변화 유무가 있으면 이벤트(event)가 발생하도록 객체 텍스트에 텍스트 리스너(TextListener)를 등록한다. this는 현재의 객체를 가리킨다. 예를 들면, t = new TextField(30);에 의해 t 텍스트필드를 생성하고, t.addTextListener(this);에 의해 t 텍스트필드의 내용에 변화가 생겼을 때 이벤트(vent)가 발생하도록 t 텍스트필드 객체에 텍스트 리스너(TextListener)를 등록한다. 127~130행: 이벤트가 발생하면 이벤트 처리를 위해 textValueChanged() 메소드를 구현한다. t.getText()에 의해 텍스트필드에 입력된 문자열을 반환한다. ta1.append(x)에 의해 ta1 객체 텍스트 영역의 끝에 문자열 x가 첨가된다. ta2.append(y)에 의해 ta2 객체 텍스트 영역의 끝에 문자열 y가 첨가된다. 프로그램 구조 설명
[실습하기 7-4] AWT의 버튼 클래스, 레이블 클래스, 텍스트필드) 및 텍스트 영역 클래스에서 의미적(symantic) 이벤트 처리 (1/10)
[실습하기 7-4] AWT의 버튼 클래스, 레이블 클래스, 텍스트필드) 및 텍스트 영역 클래스에서 의미적(symantic) 이벤트 처리 (2/10) 001 import java.awt.*; 002 import java.awt.event.*; 003 004 public class Jv_7_4 extends Frame implements ActionListener, ItemListener, AdjustmentListener { 005 Checkbox ch, da, so, se, je; 006 Checkbox gch, gda, gso, gse, gje; 007 CheckboxGroup cbg; 008 Label label1, label2, label3, label4, label5, lb0; 009 Scrollbar vSlider, hSlider; 010 Canvas imgCanvas; 011 Button bt0; 012 String msg1 = " "; 013 String msg2 = " "; 014 015 public Jv_7_4() { 016 super("단순 컴포넌트 - 체크박스와 라디오버튼 /리스트와 초이스/ 수직 및 수평 스크롤바 / 이미지 캔버스"); 017 setLayout(new FlowLayout()); 018 019 ch = new Checkbox("천안", null, true); 020 da = new Checkbox("당진"); 021 so = new Checkbox("속초"); 022 se = new Checkbox("서울"); Jv_7_4.java
[실습하기 7-4] AWT의 버튼 클래스, 레이블 클래스, 텍스트필드) 및 텍스트 영역 클래스에서 의미적(symantic) 이벤트 처리 (3/10) 023 je = new Checkbox("제주"); 024 add(ch); 025 add(da); 026 add(so); 027 add(se); 028 add(je); 029 030 cbg = new CheckboxGroup(); 031 gch = new Checkbox("천안", cbg, false); 032 gda = new Checkbox("당진", cbg, false); 033 gso = new Checkbox("속초", cbg, true); 034 gse = new Checkbox("서울", cbg, false); 035 gje = new Checkbox("제주", cbg, false); 036 add(gch); 037 add(gda); 038 add(gso); 039 add(gse); 040 add(gje); 041 042 List list = new List(3, false); 043 list.add("천안"); 044 list.add("당진"); Jv_7_4.java
[실습하기 7-4] AWT의 버튼 클래스, 레이블 클래스, 텍스트필드) 및 텍스트 영역 클래스에서 의미적(symantic) 이벤트 처리 (4/10) 045 list.add("속초"); 046 list.add("서울"); 047 list.add("제주"); 048 add(list); 049 050 Choice choice = new Choice(); 051 choice.add("천안"); 052 choice.add("당진"); 053 choice.add("속초"); 054 choice.add("서울"); 055 choice.add("제주"); 056 add(choice); 057 058 label4 = new Label("<수직 또는 수평스크롤바 움직이면 ==> 캔버스 색깔 바뀜>", Label.CENTER); 059 add(label4); 060 label1 = new Label("수직 스크롤바: ", Label.CENTER); 061 label2 = new Label("수평 스크롤바: ", Label.CENTER); 062 vSlider = new Scrollbar(Scrollbar.VERTICAL, 0,1,0,100); 063 hSlider = new Scrollbar(Scrollbar.HORIZONTAL, 0,4,0,50); 064 add(label1); 065 add(vSlider); 066 add(label2); Jv_7_4.java
[실습하기 7-4] AWT의 버튼 클래스, 레이블 클래스, 텍스트필드) 및 텍스트 영역 클래스에서 의미적(symantic) 이벤트 처리 (5/10) 067 add(hSlider); 068 069 label3 = new Label("이미지 캔버스: ", Label.CENTER); 070 imgCanvas = new Canvas(); 071 imgCanvas.setBackground(Color.yellow); 072 imgCanvas.setSize(200,150); 073 add(label3); 074 add(imgCanvas); 075 076 lb0 = new Label("종료 버튼:"); 077 bt0 = new Button("종료"); 078 add(lb0); 079 add(bt0); 080 081 setSize(730, 450); 082 setVisible(true); 083 084 bt0.addActionListener(this); 085 ch.addItemListener(this); 086 da.addItemListener(this); 087 so.addItemListener(this); 088 se.addItemListener(this); Jv_7_4.java
[실습하기 7-4] AWT의 버튼 클래스, 레이블 클래스, 텍스트필드) 및 텍스트 영역 클래스에서 의미적(symantic) 이벤트 처리 (6/10) 089 je.addItemListener(this); 090 gch.addItemListener(this); 091 gda.addItemListener(this); 092 gso.addItemListener(this); 093 gse.addItemListener(this); 094 gje.addItemListener(this); 095 vSlider.addAdjustmentListener(this); 096 hSlider.addAdjustmentListener(this); 097 } 098 099 public static void main(String[] args) { 100 Jv_7_4 c1 = new Jv_7_4(); 101 } 102 103 public void actionPerformed(ActionEvent evt) { 104 String str = evt.getActionCommand(); 105 if (str.equals("종료")) 106 System.exit(0); 107 } 108 109 public void itemStateChanged(ItemEvent ie) { 110 repaint(); 111 } Jv_7_4.java
[실습하기 7-4] AWT의 버튼 클래스, 레이블 클래스, 텍스트필드) 및 텍스트 영역 클래스에서 의미적(symantic) 이벤트 처리 (7/10) 112 113 public void adjustmentValueChanged(AdjustmentEvent ae) { 114 imgCanvas.setBackground(Color.green); 115 imgCanvas.repaint(); 116 } 117 public void paint(Graphics g) { 118 msg1 = "<체크상자를 선택하면 상태를 알수 있음>"; 119 g.drawString(msg1, 100, 320); 120 msg1 = "천안(체크상자): " + ch.getState(); 121 g.drawString(msg1, 100, 340); 122 msg1 = "당진(체크상자): " + da.getState(); 123 g.drawString(msg1, 100, 360); 124 msg1 = "속초(체크상자): " + so.getState(); 125 g.drawString(msg1, 100, 380); 126 msg1 = "서울(체크상자): " + se.getState(); 127 g.drawString(msg1, 100, 400); 128 msg1 = "제주(체크상자): " + je.getState(); 129 g.drawString(msg1, 100, 420); 130 131 msg2 = "<라디오 버튼을 선택하면 선택을 알수 있음>"; 132 g.drawString(msg2, 400, 320); 133 msg2 = "선택한 지명(라디오버튼): "; 134 msg2 += cbg.getSelectedCheckbox().getLabel(); Jv_7_4.java
[실습하기 7-4] AWT의 버튼 클래스, 레이블 클래스, 텍스트필드) 및 텍스트 영역 클래스에서 의미적(symantic) 이벤트 처리 (8/10) 135 g.drawString(msg2, 400, 340); 136 } 137 } Jv_7_4.java
[실습하기 7-4] AWT의 버튼 클래스, 레이블 클래스, 텍스트필드) 및 텍스트 영역 클래스에서 의미적(symantic) 이벤트 처리 (9/10) 004행: ActionListener는 의미적(symantic) 이벤트 중의 하나인 액션 이벤트(ActionEvent)를 처리하기 위해 사용되는 인터페이스(interface)이다. ItemListener는 의미적(symantic) 이벤트 중의 하나인 아이템(체크박스와 라디오 버튼, 리스트와 초이스)을 갖는 컴포넌트의 이벤트 처리를 하기 위해 사용되는 인터페이스다. AdjustmentListener는 의미적(symantic) 이벤트 중의 하나인 스크롤바의 값이 변경되었을 때 처리하기 위해 사용되는 인터페이스다. 084행: 버튼을 누를 때 이벤트(event)가 발생하도록 객체 버튼에 액션리스너(ActionListener)를 등록한다. this는 현재의 객체를 가리킨다. 예를 들면, bt0 = new Button("종료");에 의해 bt0 버튼을 생성하고, bt0.addActionListener(this);에 의해 bt0 버튼을 누를 때 이벤트(vent)가 발생하도록 bt0 객체 버튼에 액션리스너(ActionListener)를 등록한다. 085~094행: 아이템(체크박스와 라디오 버튼, 리스트와 초이스)을 선택할 때이벤트(event)가 발생하도록 객체 아이템에 아이템 리스너(ItemListener)를 등록한다. this는 현재의 객체를 가리킨다. 예를 들면, da = new Checkbox("당진");에 의해 체크박스의 da 아이템을 생성하고, da.addItemListener(this);에 의해 체크상자의 da 아이템을 선택할 때 이벤트(event)가 발생하도록 da 객체 아이템에 아이템 리스너(ItemListener)를 등록한다 프로그램 구조 설명
[실습하기 7-4] AWT의 버튼 클래스, 레이블 클래스, 텍스트필드) 및 텍스트 영역 클래스에서 의미적(symantic) 이벤트 처리 (10/10) 095~096행: 스크롤바의 값이 변경될 때 객체 버튼에 어드저스트먼트 리스너AdjustmentListener)를 등록한다. this는 현재의 객체를 가리킨다. 103~107행: ActionEvent 클래스의 getActionCommand() 메소드를 이용하면 이벤트를 발생시킨 컴포넌트와 관련된 문자열을 식별한다. 여기서는 버튼의 이름을 얻을 수 있다. 버튼의 이름이 “종료”와 같은 지를 묻는 if문이다. 버튼의 이름이 “종료”와 같으면 수행하는 과정이다. System.exit(0);는 System 클래스의 exit() 메소드를 호출하 는 것이며, 자바 애플리케이션을 종료시킨다. 자바 애플리케이션을 강제로 종료시키기 위해 Ctrl키와 C 키를 동시에 누를 필요가 없다. 109~111행: 아이템의 상태 변화가 발생하면 repaint(); 메소드에 의해 paint() 메소드가 실행된다. 117~136행: 화면에 그리기 위해 paint() 메소드를 사용한 경우이다. Graphics 클래스에 있는 g라는 객체다. Graphics 클래스에 있는 g라는 객체의 drawString() 메소드를 사용해 화면에 문자열을 출력한다. “<체크상자를 선택하면 상태를 알수 있음>”이라는 문자열은 좌, 윗 상단을 0으로하여 x좌표(좌에서 우로) 100, y좌표(우에서 아래로) 320 픽셀의 위치부터 출력한다. 상태는 getState() 메소드를 사용해 얻을 수 있다. 113~116행: 이벤트가 발생하면 이벤트 처리를 위해 adjustmentValueChanged() 메소드를 구현한다. 이미지 캔버스에 초록색으로 다시 칠하게 된다. 프로그램 구조 설명