프로그래머를
프로그래머를 위한 위한 Java 2 Java 2 제 제 7 7 장 장 이벤트 이벤트 프로그래밍 프로그래밍
참고: 구 버전 (2005년 이전)의 7장 이벤트 프로그래밍
7.2 : AWT event 7.3 : Swing event 신 버전 (2006년 이후)의
7.3 : 이벤트 부분
Event
이벤트
2이벤트 ( ( 신 신 7.3) 7.3)
z
이벤트
사용자의 액션 혹은 시스템의 어떤 사건
z
이벤트 드리븐 프로그래밍
z
이벤트 분류
Low level event – 세부적인 이벤트
High level event – 논리적인 이벤트
Event
이벤트
3이벤트 프로그램 프로그램 작성 작성 ( ( 신 신 7.3) 7.3)
z
이벤트 프로그램 작성 요령
GUI 컴포넌트(예: JButton)를 생성한다.
이벤트 리스너 인터페이스(예: ActionListener)를 구현하는 클래스를 작성한다.
GUI 컴포넌트에 이벤트 리스너를 등록(예: addActionListener())한다.
z
이벤트 관련 패키지
java.awt.event
javax.swing.event
Event
7.
47. 이벤트 이벤트 프로그래밍 프로그래밍
z
이벤트 -드리븐 (event-driven) 프로그래밍
마우스 버튼 클릭, 더블 클릭, 마우스 이동 등의 모든 사용자 액션에 대해 응답하는 형태로 작동하도록 하는 프로그래밍
윈도우 환경에서는 대부분의 응용프로그램이 이벤트-드리븐 프로그래밍
방식으로 작성된다.
일반 프로그램 이벤트-드리븐 프로그램
Event
7.1 AWT
57.1 AWT 이벤트 이벤트
z
고수준 이벤트
여러 개의 작은 이벤트들로 이루어져 있는 의미 있는 것
예: “마우스를 클릭한다”
z
저수준 이벤트
작은 작업들로 세밀하게 표현되는 것
예: 마우스 클릭 --> “마우스를 이동한다.”, ”마우스를 누른다.”, ”마우스를 띤다.”
z
버튼에서 클릭에 따른 이벤트 처리과정
1. 버튼 객체를 생성한다.
Button ok = new Button("OK");
2. 버튼을 클릭하는 경우에 수행할 작업을 버튼에 등록한다. 버튼에
등록할 때 addActionListener()라는 메소드를 이용한다.
ok.addActionListener(...)
Event
7.1 AWT
67.1 AWT 이벤트 이벤트
z
예제 ) 버튼에서 액션 이벤트를 처리
ActionListener 인터페이스를 임플리멘츠해야 한다.
ActionListener 인터페이스를 임플리멘츠하는 클래스는 actionPerformed() 메소드를 만들어야 한다.
버튼에서 클릭이 발생하면 아래 그림과 같이 등록된 이벤트 핸들러 클래스의
actionPerformed() 메소드가 호출되어 실행
Event
7.1 AWT
77.1 AWT 이벤트 이벤트
z
버튼에 수행내용 등록
addActionListener(..) 메소드 이용.
이 메소드의 매개변수는 버튼 클릭에 의해 작업할 내용을 갖는 객체임.
버튼을 클릭하면 actionPerformed(ActionEvent )가 수행되도록 약속되어 있음.
객체에 actionPerfomed(ActionEvent) 메소드가 있음을 보장하기 위해 ActionListener인터페이스를 임프리멘츠함.
...
....
...
O K
implements ActionListener
public void actionPerformed (ActionEvent e) {
...
} Button ok = new Button("OK");
ok.addActionListener( );
class 등록
Event
이벤트
8이벤트 프로그램 프로그램 작성 작성
z
예제 : ButtonEvent.java (신 7.3.1)
2 import java.awt.event.*;…
5 public class ButtonEvent extends JFrame implements ActionListener {
…
11 ok = new JButton("OK");
12 ok.addActionListener(this);
…
20 public void actionPerformed(ActionEvent e) { 21 Object o = e.getSource();
22 if(o == ok) {
23 System.out.println("OK");
Event
이벤트
9이벤트 클래스들 클래스들
z
이벤트 클래스 상속 관계 (신 7.3.2)
Event
이벤트
10이벤트 클래스들 클래스들
z
EventObject
이벤트 클래스의 가장 상위 클래스
z
ActionEvent
버튼 클릭, 텍스트 필드에서 엔터 입력, 리스트에서 더블 클릭, 메뉴아이템 선택
z
ItemEvent
체크박스, 라디오, 리스트, 콤보박스
z
MouseEvent, MouseWheelEvent
마우스 작동
z
KeyEvent
키보드 입력
Event
이벤트
11이벤트 처리 처리
z
이벤트 처리 절차
Event
7.1 AWT
127.1 AWT 이벤트 이벤트
z
AWT 컴포넌트에서 발생할 수 있는 이벤트들
발생할 수 있는 이벤트 AWT
컴포넌트 action adjus tment
comp onent
cont ainer
focu s
ite m
ke y
mous e
mouse motio
n
text window
Button Canvas Checkbox Checkbox MenuItem Choice Componen tContainer Dialog Frame Label
X X X X X X
X X X X X
X X X X X X
X
X X X X X X
X X X X X
X X X X X X
X X X X X X X
X X X X X X X
X X X X X
Event
7.1 AWT
137.1 AWT 이벤트 이벤트
발생할 수 있는 이벤트 AWT
컴포넌트 actio
n
adjust ment
com pone nt
cont ainer
focu s
ite m
key mous e
mouse motio n
text window
List
MenuItem Panel Scrollbar ScrollPane TextArea TextCompo nent
TextField Window
X X X X X X X
X
X X X X X X
X X X X X X
X X X X X X
X X X X X X
X X X X X X
X X X X X X X
X X X X X X X
Event
7.1 AWT
147.1 AWT 이벤트 이벤트
z 각 이벤트에 따라 등록해야 하는 인터페이스들이 있다.
z 인터페이스 이름은 “
이벤트 이름 +Listener”의 형태이다.
z
인테페이스에 선언된 메소드의 목록
Listener Interface Adapter Class Methods ActionListener none actionPerformed(ActionEvent)
AdjustmentListener none adjustmentValueChanged(AdjustmentEven ComponentListener ComponentAdapt t)
er
componentHidden(ComponentEvent) componentMoved(ComponentEvent) componentResized(ComponentEvent) componentShown(ComponentEvent) ContainerListener ContainerAdapter componentAdded(ContainerEvent)
componentRemoved(ContainerEvent)
Event
7.1 AWT
157.1 AWT 이벤트 이벤트
Listener Interface Adapter Class Methods FocusListener FocusAdapter focusGained(FocusEvent)
focusLost(FocusEvent)
ItemListener none itemStateChanged(ItemEvent)
KeyListener KeyAdapter keyPressed(KeyEvent) keyReleased(KeyEvent) keyTyped(KeyEvent)
MouseListener MouseAdapter mouseClicked(MouseEvent) mouseEntered(MouseEvent) mouseExited(MouseEvent) mousePressed(MouseEvent) mouseReleased(MouseEvent) MouseMotionListener MouseMotionAdapter mouseDragged(MouseEvent)
mouseMoved(MouseEvent)
Event
7.1 AWT
167.1 AWT 이벤트 이벤트
Listener Interface Adapter Class Methods
TextListener none textValueChanged(TextEvent) windowActivated(WindowEvent) windowClosed(WindowEvent) windowClosing(WindowEvent) windowDeactivated(WindowEvent) windowDeiconified(WindowEvent) windowIconified(WindowEvent) windowOpened(WindowEvent) WindowListener WindowAdapter
Event
7.2
177.2 이벤트 이벤트 처리 처리
7.2.1 기본적인 클래스들
1. EventObject 클래스
java.util 패키지의 EventObject는 모든 이벤트 클래스들에서 가장 상위에 있는 클래스이다. 따라서 모든 이벤트 클래스들은 직접 혹은 간접적으로 이 클래스로부터 상속받고 있다.
생성자와 메소드
EventObject(Object source) - EventObject 타입의 객체를 생성.
Object getSource() - 이벤트가 발생한 객체를 리턴.
String toString() - 이벤트를 문자열로 리턴.Event
7.2
187.2 이벤트 이벤트 처리 처리
2. AWTEvent 클래스
AWT이벤트를 위한 클래스 중에서 가장 상위 클래스, EventObject 로부터 상속받음.
AWTEvent는 AWT 이벤트를 표현하기 위해 id 속성을 가진다
생성자와 메소드
AWTEvent(Event event)- JDK1.0에서 사용되던 이벤트(Event) 타입의 객체를 이용해서 AWTEvent를 생성.
AWTEvent(Object source, int id)- 이 벤 트 가 발 생 한 곳 (source) 와 이벤트 타입(id) 를 이용해서 AWTEvent를 생성.
int getID() - 이벤트 타입을 리턴.
String paramString() - 이벤트의 상태를 문자열로 리턴.Event
7.2
197.2 이벤트 이벤트 처리 처리
7.2.2 ActionEvent
컴포넌트에서 정의한 고수준의 이벤트가 발생한 것을 표현하기 위한
클래스
액션 이벤트가 발생하는 경우
버튼을 클릭할 때
텍스트필드에서 엔터를 칠 때
리스트에서 더블 클릭할 때
메뉴 아이템을 선택할 때(클릭할 때) ActionEvent 생성자
ActionEvent(Object source, int id, String command) - ActionEvnet를 생성한다.
ActionEvent(Object source, int id, String command, int modifiers) - 모디파이어 키가 눌려진 ActionEvent를 생성한다.Event
7.2
207.2 이벤트 이벤트 처리 처리
ActionEvent는 다음과 같은 메소드들을 가진다.
String getActionCommand() - 액션과 관련된 명령어 문자열을 리턴한다.
int getModifiers() - 액션이 발생할 때 눌려진 모디파이어 키를 리턴한다. 모디파이어 키는 쉬프트, 알트, 컨트롤 키를 의미한다.1. 버튼
버튼을 마우스로 클릭하는 경우에 ActionEvent가 발생.
버튼의 액션 이벤트를 처리하기 위해서는 버튼을 생성한 후에
addActionListener() 메소드를 호출해서 이벤트 처리 루틴을 등록해주어야함.
ActionListener 인터페이스에는 actionPerformed()가 선언되어 있으므로 임플리멘츠하는 클래스는 actionPerformed()를 정의해주어야함 .
Event
7.2
217.2 이벤트 이벤트 처리 처리
z 예제: ButtonEvent.java 1 import java.awt.*;
2 import java.awt.event.*;
3
4 public class ButtonEvent extends Frame implements ActionListener { 5 Button exit, print;
6
7 public ButtonEvent() {
8 super("버튼의 이벤트 테스트");
9 print = new Button("Hello");
10 print.addActionListener(this);
11
12 exit = new Button("Exit");
13 exit.addActionListener(this);
14
15 add("North", print);
16 add("South", exit);
17
18 setSize(300, 200);
Event
7.2
227.2 이벤트 이벤트 처리 처리
19 setVisible(true);
20 } 21
22 public void actionPerformed(ActionEvent e) { 23 if(e.getSource() == print) {
24 System.out.println("Hello~~");
25 }else if(e.getSource() == exit) { 26 setVisible(false);
27 dispose();
28 System.exit(0);
29 } 30 } 31
32 public static void main(String args[]) { 33 ButtonEvent be = new ButtonEvent();
34 } 35 }
Event
7.2
237.2 이벤트 이벤트 처리 처리
`
2. 텍스트 필드 텍스트 필드에서 엔터 키를 입력하는 경우에 ActionEvent가 발생한다.
z 예제: TextFieldEvent.java 1 import java.awt.*;
2 import java.awt.event.*;
3
4 public class TextFieldEvent extends Frame implements ActionListener { 5 TextField one, two;
6 Button exit;
7
8 public TextFieldEvent() {
9 super("텍스트필드 이벤트");
10 one = new TextField("How are you ?");
11 one.addActionListener(this);
12 two = new TextField("Hello");
13 two.addActionListener(this);
14 exit = new Button("Exit");
15 exit.addActionListener(this);
Event
7.2
247.2 이벤트 이벤트 처리 처리
17 add("North", one);
18 add("South", two);
19 add("East", exit);
………..
24 public void actionPerformed(ActionEvent e) { 25 if(e.getSource() == one) {
26 String msg = two.getText();
27 two.setText(one.getText());
28 one.setText(msg);
29 }else if(e.getSource() == two) {
30 System.out.println(two.getText());
31 String msg = two.getText();
32 two.setText(one.getText());
33 one.setText(msg);
34 }else if(e.getSource() == exit) { 35 setVisible(false);
36 dispose();
37 System.exit(0);
………
Event
7.2
257.2 이벤트 이벤트 처리 처리
7.2.3 ItemEvent
ItemEvent는 체크박스, 라디오버튼, 선택, 리스트에서 아이템이 선택되거나 선택이 해제되는 경우에 발생하는 고수준 이벤트이다.
ItemEvent의 멤버 필드
static int DESELECTED - 선택이 해제된 것
static int ITEM_STATE_CHANGED - 아이템의 상태가 변경됨
static int SELECTED - 아이템이 선택된 것 ItemEvent의 생성자
ItemEvent(ItemSelectable source, int id, Object item, int stateChange) - ItemEvnet를 생성한다Event
7.2
267.2 이벤트 이벤트 처리 처리
ItemEvent의 메소드
Object getItem() - 이벤트에 의해 영향받는 아이템을 리턴한다.
ItemSelectable getItemSelectable() - 이벤트의 발생지를 리턴한다.
int getStateChange() - 변경된 상태를 리턴한다. ItemEvent를 처리하기 위해서는 ItemListener 인터페이스를
임플리멘츠한 이벤트 핸들러를 addItemListener() 메소드를 이용해서 등록해야 한다.
ItemListener 인터페이스는 itemStateChanged() 메소드를 가지고 있다.
void itemStateChanged(ItemEvent e)- 아이템이 선택되거나 선택이 해제될 때 자동적으로 호출된다.
Event
7.2
277.2 이벤트 이벤트 처리 처리
1. 체크 박스
체크박스를 선택하거나 선택을 해제할 때 ItemEvent가 발생한다.
z 예제: CheckEvent.java
………..
4 public class CheckEvent extends Frame
5 implements ItemListener, ActionListener {
……….
11 public CheckEvent() {
……….
15 top.add(one = new Checkbox("One"));
16 one.addItemListener(this);
17 top.add(two = new Checkbox("Two"));
18 two.addItemListener(this);
19
20 Panel bottom = new Panel();
21 cbg = new CheckboxGroup();
22 bottom.add(male = new Checkbox("남자", cbg, true));
23 male.addItemListener(this);
Event
7.2
287.2 이벤트 이벤트 처리 처리
24 bottom.add(female = new Checkbox("여자", cbg, false));
25 female.addItemListener(this);
………..
44 public void itemStateChanged(ItemEvent e) { 45 Object o = e.getSource();
46
47 if(o == one) {
48 System.out.println(e.getItem());
49 }else if(o == two) {
50 if(e.getStateChange() == ItemEvent.SELECTED) { 51 System.out.println("two is selected");
52 } else {
53 System.out.println("two is deselected");
54 }
55 }else if(o == male) {
56 System.out.println("남자 - selected");
57 }else if(o == female) {
58 System.out.println("여자 - selected");
59 } 60 }
………..
Event
7.2
297.2 이벤트 이벤트 처리 처리
2. 선택 버튼(Choice)
선택버튼의 아이템을 선택하는 경우에 ItemEvent가 발생한다.
3. 라디오 버튼(Radio)
라디오 버튼은 체크박스의 특수한 형태이다. 라디오 버튼을
선택하는 경우에 ItemEvent가 발생한다.
4. 리스트(List)
리스트의 아이템을 더블 클릭하는 경우에는 ActionEvent가, 한번 클릭하는 경우에는 ItemEvent가 발생한다.
Event
7.2
307.2 이벤트 이벤트 처리 처리
z 예제: ChoiceListEvent.java
………
4 public class ChoiceListEvent extends Frame 5 implements ActionListener, ItemListener {
………
11 public ChoiceListEvent() {
12 super("Choice와 List 이벤트");
13
14 fruits = new Choice();
15 fruits.addItemListener(this);
16 fruits.add("Apple");
17 fruits.add("Orange");
18 fruits.add("Banna");
19
20 color = new List(3, true);
21 color.addItemListener(this);
22 color.addActionListener(this);
23 color.add("blue");
24 color.add("red");
………
Event
7.2
317.2 이벤트 이벤트 처리 처리
51 public void itemStateChanged
itemStateChanged
((
ItemEventItemEvent
e) {e)
52 Object o = e.getSource();53 if(o == fruits) {
54 System.out.println(fruits.getSelectedItem());
55 } else if(o == color) {
56 Object si[] = color.getSelectedItems();
57 System.out.println("현재 선택된 아이템들");
58 for(int i=0; i < si.length; i++) { 59 System.out.print(si[i] + " ");
60 }
61 System.out.println("\n---");
62 System.out.print("이벤트가 발생한 아이템: ");
63 int index = ((Integer)e.getItem()).intValue();
64 System.out.println(color.getItem(index));
65 System.out.println("\n---\n");
66 } 67 }
………..
Event
7.2
327.2 이벤트 이벤트 처리 처리
7.2.4 WindowEvent
윈도우의 상태가 변경될 때 발생하는 저수준의 이벤트.
윈도우가 열리는 경우, 닫히는 경우, 활성화되는 경우, 비활상화되는 경우,
아이콘이 되는 경우, 아이콘에서 원도우로 다시 변경되는 경우에 발생.
윈도우, 다이얼로그, 프레임에서 발생할 수 있다.
WindowEvnet의 생성자와 메소드
WindowEvent(Window source, int id) - WindowEvent를 생성한다.
Window getWindow() - 이벤트가 발생한 윈도우를 리턴한다. WindowListener 인터페이스의 7개 메소드를 모두 정의할 필요가
없을 경우, WindowAdapter클래스를 상속하는 클래스를 정의하고 필요한
메소드만 오버라이드하여 사용하는 것이 가능.
Event
7.2
337.2 이벤트 이벤트 처리 처리
z 예제: FrameEvent.java
………..
4 public class FrameEvent extends Frame { 5 Label msg;
6
7 public FrameEvent() {
………..
12 addWindowListener(new WindowHandler());
13 setSize(300, 200);
14 setVisible(true);
15 } 16
17 public class WindowHandler extends WindowAdapter { 18 public void windowClosing(WindowEvent e) {
19 Window w = e.getWindow();
20 w.setVisible(false);
21 w.dispose();
22 System.exit(0);
23 }
………..
Event
7.2
347.2 이벤트 이벤트 처리 처리
7.2.5 MouseEvent
마우스 관련 이벤트는 마우스 클릭과 마우스 이동에 관한 2가지 형태로 분류할 수 있다 .
마우스 클릭 관련 이벤트는 MouseListener 인터페이스에서 관리
마우스 이동 관련 이벤트는 MouseMotion Listener 인터페이스에서 관리
각각 MouseAdapter와 MouseMotionAdapter 클래스들을 제공
예제: DrawRect.java
6 int startX, startY, w, h;
7
8 public void init() {
9 addMouseListener(new MouseEventHandler());
10 addMouseMotionListener(new MouseMotionHandler());
Event
7.2
357.2 이벤트 이벤트 처리 처리
……
21 public class MouseMotionHandler extends
extends
MouseMotionAdapter {MouseMotionAdapter
22 public void mouseDragged(MouseEvent e) {23 w = Math.abs(startX - e.getX());
24 h = Math.abs(startY - e.getY());
25 repaint();
……
29 public class MouseEventHandler extends
extends
MouseAdapter {MouseAdapter
30 public void mousePressed(MouseEvent e) {31 startX = e.getX();
32 startY = e.getY();
33 } 34
35 public void mouseReleased(MouseEvent e) { 36 w = Math.abs(startX - e.getX());
37 h = Math.abs(startY - e.getY());
38 repaint();
……
Event
7.2
367.2 이벤트 이벤트 처리 처리
7.2.6 KeyEvent
1. InputEvent
InputEvent는 KeyEvent와 MouseEvent의 부모 클래스로서, 모든 컴포넌트의 입력을 위한 이벤트의 가장 상위 클래스이다.
InputEvent는 이벤트가 발생된 컴포넌트에서 기본적으로 처리되기 전에
리스너로 먼저 전달된다. 따라서, 필요한 경우에는 리스너(listener) 부분에서 먼저 이벤트를 처리하고, 이벤트가 발생한 컴포넌트가 디폴트 작업하지 못하도록 할 수 있다.
InputEvent의 메소드
void consume() - 이 벤 트 가 발 생 한 컴 포 넌 트 에 서 디 폴 트 로 작업하지 안도록 이벤트를 소비한다.
int getModifiers() - 모디파이어 플래그값을 리턴한다.Event
7.2
377.2 이벤트 이벤트 처리 처리
long getWhen() - 이벤트가 발생한 시간의 타임 스탬프 값을 리턴한다.
boolean isAltDown() - ALT 키가 눌려졌는지 알아본다.
boolean isConsumed() - 이벤트가 소비되었는지 여부를 알려준다.
boolean isControlDown() - Control 키 가 눌 려 졌 는 지 여 부 를 리턴한다.
boolean isMetaDown() - Meta 키가 눌려졌는지 여부를 리턴한다.
boolean isShiftDown() - Shift 키가 눌려졌는지 여부를 리턴한다.Event
7.2
387.2 이벤트 이벤트 처리 처리
2. KeyEvent
KeyEvent는 InputEvent 클래스로부터 상속받는다.
KeyEvent는 사용자가 키보드의 키를 누르거나, 띠거나, 문자를 입력할
때 발생한다.
KeyEvent를 처리하기 위한 KeyListener의 메소드들
void keyPressed(KeyEvent e) - 키보드를 누르는 순간에 호출되는 메소드이다. 또한 키를 계속 누르고 있는 경우에도 이 메소드가 계속 호출된다.
void keyReleased(KeyEvent e) - 눌려진 키보드를 띠는 순간에 호출되는 메소드이다.
void keyTyped(KeyEvent e) - 키보드를 눌렀다 띰으로서 문자를 입력할 때 호출되는 고차원 메소드이다. KeyEvent의 메소드들
char getKeyChar() - 입력된 문자를 리턴한다.
int getKeyCode() - 입력된 키의 정수형 키 코드 값을 리턴한다.Event
7.2
397.2 이벤트 이벤트 처리 처리
z 예제: NumberInput.java 1 import java.awt.*;
2 import java.awt.event.*;
3
4 public class NumberInput extends Frame implements 5 ActionListener, KeyListener {
6
7 TextField input;
8 Button exit;
9
10 public NumberInput() { 11 super("숫자 입력");
12 input = new TextField();
13 input.addKeyListener(this);
14 exit = new Button("Exit");
15 exit.addActionListener(this);
………
Event
7.2
407.2 이벤트 이벤트 처리 처리
24 public voidpublic void keyPressed
keyPressed
((
KeyEventKeyEvent
e) {e)
25 char c = e.getKeyChar();26 if(!(('0' <= c && c <= '9') || c == '.' ||
27 c == '' || c == '')) {
28 System.out.println("Not number !!");
29 } 30 } 31
32 public voidpublic void keyTyped(
keyTyped
(KeyEventKeyEvent e) { }e)
33 public voidpublic void keyReleasedkeyReleased
((
KeyEventKeyEvent
e) { }e)
3435 public void actionPerformed(ActionEvent e) { 36 setVisible(false);
37 dispose();
38 System.exit(0);
39 }
………..
Event
7.2
417.2 이벤트 이벤트 처리 처리
7.2.7 TextEvent
TextEvent는 텍스트 컴포넌트(텍스트 필드, 텍스트 영역)에서 텍스트
내용이 변경되는 경우에 발생한다.
TextEvent를 처리하는 TextListener 인터페이스의 메소드
void textValueChanged(TextEvent e) - 텍스트 내용이 변경되는 경우에 호출된다.z 예제: TextEventTest.java 1 import java.awt.*;
2 import java.awt.event.*;
3
4 public class TextEventTest extends Frame implements 5
TextListener, ActionListener {
6
7 TextArea edit;
8 Button exit;
Event
7.2
427.2 이벤트 이벤트 처리 처리
10 public TextEventTest() { 11 super("텍스트 이벤트");
12 edit = new TextArea();
13 edit.addTextListener(this);
14 exit = new Button("Exit");
15 exit.addActionListener(this);
………
23 public void actionPerformed(ActionEvent e) { 24 setVisible(false);
25 dispose();
26 System.exit(0);
27 } 28
29 public void
public void
textValueChangedtextValueChanged
((
TextEventTextEvent
e) {e)
30 System.out.println("텍스트 내용이 변경되었습니다.");
31 }
………
Event
7.2
437.2 이벤트 이벤트 처리 처리
7.2.8 기타
1. 스크롤바의 이벤트
스 크 롤 바 에 서 는 AdjustmentEvent가 발생할 수 있다. 이 이벤트는 AdjustmentListener 인터페이스를 이용해서 처리할 수 있다.
AdjustmentListener 인터페이스의 메소드
void adjustmentValueChanged(AdjustmentEvent e) - 값이 변경되는 경우에 호출된다. AdjustmentEvent 클래스의 중요한 메소드
int getValue() - 현재 값을 리턴한다.2. 컴포넌트 이벤트
ComponentEvent는 컴포넌트가 이동하거나, 크기가 변경되거나, 혹은
화면에 보이거나 안보일 때 발생되는 저수준의 이벤트이다.
Event
7.2
447.2 이벤트 이벤트 처리 처리
ComponentEvent를 처리하는 ComponentListener 인터페이스의 메소드
void componentHidden(ComponentEvent e) - 컴포넌트가 화면에서 안보이게 될 때 호출된다.
void componentMoved(ComponentEvent e) - 컴포넌트의 위치가 변경될 때 호출된다.
void componentResized(ComponentEvent e) - 컴포넌트의 크기가 변경될 때 호출된다.
void componentShown(ComponentEvent e) - 컴포넌트가 화면에 보이게 될 때 호출된다.Event
7.2
457.2 이벤트 이벤트 처리 처리
z 예제: TestCanvas.java 1 import java.awt.*;
2
3 public class TestCanvas extends Canvas { 4 Image img;
5 int tx, ty, w, h;
6 Dimension preferredSize;
7 String msg;
8 Font font;
9
10 TestCanvas(String msg) { 11 super();
12 this.msg = msg;
13
14 font = new Font("Courier", Font.PLAIN, 16);
15 FontMetrics metric = getFontMetrics(font);
16 w = metric.stringWidth(msg);
17 h = metric.getHeight();
18 preferredSize = new Dimension(w+8, h+6);
19 }
Event
7.2
467.2 이벤트 이벤트 처리 처리
20
21 public int getImageWidth() { 22 return preferredSize.width;
23 } 24
25 public void update(Graphics g) { 26 paint(g);
27 } 28
29 public void paint(Graphics g) { 30 if(img == null) {
31 img = createImage(w+8,h+6);
32 Graphics gc = img.getGraphics();
33 gc.setFont(font);
34 gc.drawString(msg, 2, h - 4);
35 }
36 g.translate(-tx, -ty);
37 g.drawImage(img, 0, 0, getBackground(), this);
38 } 39 }
Event
7.2
477.2 이벤트 이벤트 처리 처리
z 예제: TestBar.java 1 import java.awt.*;
2 import java.awt.event.*;
3
4 public class TestBar extends Frame implements
5 ActionListener, AdjustmentListener, ComponentListener { 6
7 Scrollbar bar;
8 TestCanvas canvas;
9 Button exit;
10
11 public TestBar() {
12 super("스크롤바 이벤트");
13 String msg = "The VisMap system provides for " + 14 "visual manipulation of arbitray off-the-shelf " + 15 "applications, through an application's graphical" + 16 " user interface.";
17
18 canvas = new TestCanvas(msg);
19 canvas.addComponentListener(this);
Event
7.2
487.2 이벤트 이벤트 처리 처리
21 bar = new Scrollbar(Scrollbar.HORIZONTAL);
22 bar.addAdjustmentListener(this);
23 bar.setMaximum(canvas.getImageWidth() - 24 canvas.getSize().width);
25
26 exit = new Button("Exit");
27 exit.addActionListener(this);
……….
37 public void adjustmentValueChanged(AdjustmentEvent e) { 38 canvas.tx = bar.getValue();
39 canvas.repaint();
40 } 41
42 public void actionPerformed(ActionEvent e) { 43 setVisible(false);
44 dispose();
45 System.exit(0);
46 }
Event
7.2
497.2 이벤트 이벤트 처리 처리
48 public void componentResized(ComponentEvent e) { 49 bar.setMaximum(canvas.getImageWidth() -
50 canvas.getSize().width);
51 } 52
53 public void componentMoved(ComponentEvent e) { } 54 public void componentShown(ComponentEvent e) { } 55 public void componentHidden(ComponentEvent e) { }
……….
Event
7.3 스윙 이벤트
50 스윙은 기본적으로 AWT의 이벤트를 그대로 사용할 수 있으며, 별도의
컴포넌트를 위해서는 javax.swing.event 패키지에 새로운 이벤트들을 정의하고 있다.
스윙 컴포넌트에서 발생할 수 있는 이벤트들
Listener Component
action caret change document, undoable edit
item list
selection window
button X X X
check box X X X
color chooser X
combobox X X
dialog X
editor pane X X
file chooser X
Event
7.3 스윙 이벤트
51Listener Component
action caret change document, undoable edit
item list
selection window
menu item X X X
option pane
popupmenu
progress bar X
password
filed X X X
frame X
internal frame
list X
menu
radio button X X X
slider X
Event
7.3 스윙 이벤트
52Listener Component
action caret change document, undoable edit
item list selection
window
tabbed pane X
toggle button X X X
tree
Viewport(used by
scrollpane)
X
table X
text area X X
text field X X X
text pane X X
Event
7.3 스윙 이벤트
53 스윙 컴포넌트 이벤트에 대한 리스너 인터페이스들과 메소드들
Listener Interface Adapter Class Listener Methods ActionListener none actionPerformed(ActionEvent) AncestorListener none ancestorAdded(AncestorEvent)
ancestorMoved(AncestorEvent) ancestorRemoved(AncestorEvent CaretListener none )caretUpdate(CaretEvent)
CellEditorListener none editingStopped(ChangeEvent) editingCanceled(ChangeEvent)
ComponentListener ComponentAdapter componentHidden(ComponentEv ent)
componentMoved(ComponentEve nt)
componentResized(ComponentEv ent)
componentShown(ComponentEve nt)
ContainerListener ContainerAdapter componentAdded(ContainerEvent )
componentRemoved(ContainerEv ent)
ChangeListener none stateChanged(ChangeEvent)
Event
7.3 스윙 이벤트
54Listener Interface Adapter Class Listener Methods DocumentListener none changedUpdate(DocumentEvent)
insertUpdate(DocumentEvent) removeUpdate(DocumentEvent) FocusListener FocusAdapter focusGained(FocusEvent)
focusLost(FocusEvent)
HyperlinkListener none hyperlinkUpdate(HyperlinkEvent) InternalFrameListen
er
InternalFrameAdapt er
internalFrameActivated(InternalFrameEvent) internalFrameClosed(InternalFrameEvent) internalFrameClosing(InternalFrameEvent) internalFrameDeactivated(InternalFrameEven t)
internalFrameDeiconified(InternalFrameEvent )
internalFrameIconified(InternalFrameEvent) internalFrameOpened(InternalFrameEvent) ItemListener none itemStateChanged(ItemEvent)
KeyListener KeyAdapter keyPressed(KeyEvent) keyReleased(KeyEvent) keyTyped(KeyEvent)
Event
7.3 스윙 이벤트
55Listener Interface Adapter Class Listener Methods ListDataListener none contentsChanged(ListDataEvent)
intervalAdded(ListDataEvent) intervalRemoved(ListDataEvent) ListSelectionListener none valueChanged(ListSelectionEvent) MenuDragMouseList
ener
none menuDragMouseDragged(MenuDragMouseEve nt)
menuDragMouseEntered(MenuDragMouseEven t)
menuDragMouseExited(MenuDragMouseEvent) menuDragMouseReleased(MenuDragMouseEv ent)
MenuKeyListener none menuKeyPressed(MenuKeyEvent) menuKeyReleased(MenuKeyEvent) menuKeyTyped(MenuKeyEvent) MenuListener none menuCanceled(MenuEvent)
menuDeselected(MenuEvent) menuSelected(MenuEvent)
Event
7.3 스윙 이벤트
56Listener Interface Adapter Class Listener Methods MouseInputListener MouseInputAdapt
er
mouseClicked(MouseEvent) mouseEntered(MouseEvent) mouseExited(MouseEvent) mousePressed(MouseEvent) mouseReleased(MouseEvent) mouseDragged(MouseEvent) mouseMoved(MouseEvent)
PopupMenuListener popupMenuCanceled(PopupMenuEvent)
popupMenuWillBecomeInvisible(PopupMenuEve nt)
popupMenuWillBecomeVisible(PopupMenuEven MouseListener MouseAdapter t)mouseClicked(MouseEvent)
mouseEntered(MouseEvent) mouseExited(MouseEvent) mousePressed(MouseEvent) mouseReleased(MouseEvent) MouseMotionListene
r
MouseMotionAda pter
mouseDragged(MouseEvent) mouseMoved(MouseEvent)
Event
7.3 스윙 이벤트
57Listener Interface Adapter Class Listener Methods TableColumnModelLi
stener
none columnAdded(TableColumnModelEvent) columnMoved(TableColumnModelEvent) columnRemoved(TableColumnModelEvent) columnMarginChanged(ChangeEvent)
columnSelectionChanged(ListSelectionEvent) TableModelListener none tableChanged(TableModelEvent)
TreeExpansionListen er
none treeCollapsed(TreeExpansionEvent) treeExpanded(TreeExpansionEvent) TreeModelListener none treeNodesChanged(TreeModelEvent)
treeNodesInserted(TreeModelEvent) treeNodesRemoved(TreeModelEvent) treeStructureChanged(TreeModelEvent) TreeSelectionListene
r
none valueChanged(TreeSelectionEvent)
Event
7.3 스윙 이벤트
58Listener Interface Adapter Class Listener Methods
TreeWillExpandListener none treeWillCollapse(TreeExpansionEvent) treeWillExpand(TreeExpansionEvent)
UndoableEditListener none undoableEditHappened(UndoableEditEvent) WindowListener WindowAdapter windowActivated(WindowEvent)
windowClosed(WindowEvent) windowClosing(WindowEvent) windowDeactivated(WindowEvent) windowDeiconified(WindowEvent) windowIconified(WindowEvent) windowOpened(WindowEvent)
Event
7.3 스윙 이벤트
59 대부분의 스윙 컴포넌트들은 AWT와 동일하거나 혹은 유사한 방법으로
이 벤 트 처 리 를 할 수 있 다 . 예 를 들 어 JButton 은 AWT 의 Button 과 동일하게 ActionEvent를 이용해서 이벤트 처리를 한다.
z 예제: AddTableRow.java (JButton에서 ActionEvent를 사용하는 예제)
4 import javax.swing.event.*;
5 import javax.swing.table.*;
6
7 public class AddTableRow extends JFrame implements ActionListener { 8 JButton add;
9 DefaultTableModel model;
10 JTable table;
11
12 public AddTableRow(){
13 super("테이블 테스트");
14 String fieldName[] = {
15 "<html>이름<br>학기순</html>", 16 "전화번호",
17 "E-Mail"
18 };
19
Event
7.3 스윙 이벤트
6020 String data[][] = {
21 "최종명", "000-0000", "jmchoi@email", 22 "박준서", "111-1111", "jspark@email", 23 "홍길동", "222-2222", "gdhong@email"
24 };
25
26 model = new DefaultTableModel(data, fieldName);
27 table = new JTable(model);
28 JScrollPane sp = new JScrollPane(table);
29 getContentPane().add(sp, BorderLayout.CENTER);
30 add = new JButton("ADD");
31 add.addActionListener(this);
32 getContentPane().add(add, BorderLayout.SOUTH);
33 setDefaultCloseOperation(EXIT_ON_CLOSE);
………..
38 public void actionPerformed(ActionEvent e) { 39 String data [] = "", "" ;
40 model.addRow(data);
41 }
………
Event
7.3 스윙 이벤트
61z
TreeSelectionEvent
JTree에서 노드를 선택하는 순간에 TreeSelectionEvent가 발생한다.
TreeSelectionListener에는 valueChanged() 메소드를 가지고 있다.
따라서, 이 메소드를 이용하는 경우에 선택된 노드를 파악할 수 있다.
예제: TreeSelection.java 1 import java.awt.*;
2 import javax.swing.*;
3 import javax.swing.tree.*;
4 import javax.swing.event.*;
5
6 public class TreeSelection extends JFrame { 7 JTree tree;
8
9 public TreeSelection() 10 super("트리 선택");
11 DefaultMutableTreeNode jcomponent =
12 new DefaultMutableTreeNode("JComponent");
13
14 DefaultMutableTreeNode jpanel =
15 new DefaultMutableTreeNode("JPanel");
Event
7.3 스윙 이벤트
6216 DefaultMutableTreeNode jtextcomponent =
17 new DefaultMutableTreeNode("JTextComponent");
18 DefaultMutableTreeNode jtree =
19 new DefaultMutableTreeNode("JTree");
20
21 jcomponent.add(jpanel);
22 jcomponent.add(jtextcomponent);
23 jcomponent.add(jtree);
24
25 DefaultMutableTreeNode jtextarea =
26 new DefaultMutableTreeNode("JTextArea");
27 DefaultMutableTreeNode jtextfield =
28 new DefaultMutableTreeNode("JTextField");
29
30 jtextcomponent.add(jtextarea);
31 jtextcomponent.add(jtextfield);
32
33 tree = new JTree(jcomponent);
Event
7.3 스윙 이벤트
6334 tree.addTreeSelectionListener(new TreeSelectionListener() { 35 public void valueChanged(TreeSelectionEvent e) {
36 DefaultMutableTreeNode node =
(DefaultMutableTreeNode)
37 tree.getLastSelectedPathComponent();
38
39 if (node == null) 40 return;
41
42 Object nodeInfo = node.getUserObject();
43 System.out.println(nodeInfo.toString());
44 } 45 });
46
47 JScrollPane sp = new JScrollPane(tree);
48 getContentPane().add(sp, BorderLayout.CENTER);
……….
Event
7.3 스윙 이벤트
64z
TableModelEvent
TableModelEvent 이벤트는 테이블의 값이 변경되는 경우에 발생한다.
TableModelListener 인터페이스는 tableChanged()라는 메소드를 가지고 있으며, TableModel에 이벤트 리스너를 등록한다.
예제: TableEventDemo.java 1 import java.awt.*;
2 import javax.swing.*;
3 import javax.swing.event.*;
4 import javax.swing.table.*;
5
6 public class TableEventDemo extends JFrame{
7
8 public TableEventDemo() 9 super("테이블 테스트");
10 String fieldName[] = {
11 "<html>이름<br>학기순</html>", 12 "전화번호",
13 "E-Mail"
14 };
15
Event
7.3 스윙 이벤트
6516 String data[][] = {
17 "최종명", "000-0000", "jmchoi@email", 18 "박준서", "111-1111", "jspark@email", 19 "홍길동", "222-2222", "gdhong@email"
20 };
21
22 JTable table = new JTable(data, fieldName);
23 TableModel model = table.getModel();
24 model.addTableModelListener(new TableModelListener() { 25 public void tableChanged(TableModelEvent e) {
26 int col = e.getColumn();
27 int row = e.getFirstRow();
28 System.out.println("<" + row + "," + col +">");
29 } 30 });
31 JScrollPane sp = new JScrollPane(table);
32 getContentPane().add(sp, BorderLayout.CENTER);
………..
Event
7.4
667.4 이벤트 이벤트 프로그래밍 프로그래밍 응용 응용
z
GEditor
이벤트 를 이용해서 그래픽 에디터를 만드는 예제 프로그램
버튼, 라벨, 텍스트영역, 텍스트필드 모양을 그려주고 자바 코드로 변환해 주는 그래픽 에디터
GEditor 에서는 각 그림들의 이동과 크기 변경이 가능
Event
7.4
677.4 이벤트 이벤트 프로그래밍 프로그래밍 응용 응용
GEditor에서 그림을 그리고, 메뉴에서 Code Gen을 선택하면 그려진 모양에 해당되는 자바 코드가 생성됨.
다음 그림은 생성된 자바 코드를 컴파일해서 실행시킨 결과
Event
7.4
687.4 이벤트 이벤트 프로그래밍 프로그래밍 응용 응용
GEDrawable 인터페이스
그래픽 에디터에서 그림을 핸들링하기 위한 기본적인 메소드들을 선언 GEDrawableRectangle 클래스
그래픽 에디터에서 가장 많이 사용될 수 있는 그림 클래스 Bbutton, Blabel, BtextArea, BtextField 클래스
버튼, 라벨, 텍스트 영역, 텍스트 필드 모양을 그려주기 위한 클래스 GEditorCanvas 클래스
그림을 그려주는 캔버스 영역 GEditor 클래스
각 클래스를 모아 작성한 그래픽 에디터 GEditor 예제 프로그램은 간단하지만, 그래픽 에디터나 인터페이스 빌더
등의 응용 분야에 적용될 수 있을 것이다.
Event 69