GUI 인터페이스의이벤트
학습목표 윈도우환경에서작성된 GUI 인터페이스의이벤트개념을이해한다. 다양한컴포넌트에대한이벤트를처리한다
이벤트란? 자바이벤트란 사용자가키보드, 마우스등의장치로부터 AWT 컴포넌트에발생시키는모든사건을의미 이벤트주도형프로그램은사용자로부터발생된이벤트를처리하여사용자와상호작용을가능하게함 자바이벤트모델 컴퓨터 키보드 운영체제 마우스 이벤트객체자바가상머신이벤트소스객체이벤트리스너객체애플리케이션
이벤트처리과정 Mouse Click addactionlistener () 3 1 4 ActionEvent 응용프로그램객체 5 2 addactionlistener () EventListener 객체 1 이벤트소스가되는객체에게이벤트리스너객체를삽입 2 리스너객체는하나이상삽입가능 3 삽입된객체에한해서이벤트소스객체에마우스클릭등과같은외부이벤트가발생 45 해당이벤트소스객체를만들고, 이를리스너객체로등록한객체들모두에게이벤트객체를전달하는메소드를호출
import java.awt.*; import java.awt.event.*; public class ButtonPress extends Frame { Button b1, b2; Label lbl; public ButtonPress(String str){ super(str); setlayout(new FlowLayout()); b1 = new Button(" 시작 "); b2 = new Button(" 종료 "); lbl = new Label(" 초기상태를보여줍니다."); ButtonHandler bh = new ButtonHandler(lbl); b1.addactionlistener(bh); b2.addactionlistener(bh); add(b1); ButtonPress.java Button 객체를생성한다. 이벤트핸들러객체를생성한다. 이벤트소스 (b1 버튼 ) 와핸들러를연결한다. add(b2); add(lbl); addwindowlistener(new WinListener()); // 프레임과핸들러연결 이벤트핸들러와연결된버튼을프레임에부착한다. public static void main(string args[]){ ButtonPress fr = new ButtonPress(" 버튼이벤트예제 "); fr.setsize(250, 130); fr.setvisible(true); class WinListener extends WindowAdapter { public void windowclosing(windowevent we){ System.exit(0);
ButtonPress.java class ButtonHandler implements ActionListener { 이벤트핸들러 Label label; public ButtonHandler(Label lbl){ label = lbl; 마우스가눌려지면자동으로처리되는메소드. ActionEvent 객체 ae는자동으로생성된다. public void actionperformed(actionevent ae){ Button b = (Button)ae.getSource(); // b는눌려진버튼의객체이다. if(b.getlabel().equals(" 시작 ")) 눌려진버튼의이름을화면에출력한다. label.settext(" 시작버튼이눌려졌습니다."); else if(b.getlabel().equals(" 종료 ")) label.settext(" 종료버튼이눌려졌습니다."); 실행결과
이벤트클래스계층구조 사용자가 GUI 컴포넌트에특정한행위를취함으로서발생하기때문에컴포넌트의종류에따라서발생하는이벤트가다를수있음 이벤트클래스의계층구조
컴포넌트별이벤트발생
ActionEvent 클래스 버튼이눌려졌거나, 리스트항목이선택되었을때또는메뉴의한항목이선택되었을때, 자동적으로객체를생성시키는클래스 메서드
AdjustmentEvent 클래스 AdjustmentEvent 클래스는스크롤바의위치를이동시키면자동적으로객체를생성시키는클래스 메서드
ComponentEvent 클래스 ComponentEvent 클래스는컴포넌트가감춰지거나, 감춰진상태에서다시나타날때, 이동하였을때, 크기를조정하였을때자동적으로객체를생성시키는클래스 메서드 Component getcomponent()
ContainerEvent 클래스 컨테이너에컴포넌트가추가되거나제거될때자동적으로객체를생성시키는클래스 메서드
FocusEvent 클래스 마우스포인터가컴포넌트영역에진입하거나나왔을때자동적으로객체를생성시키는클래스 컴포넌트가마우스의초점 (focus) 을획득하거나초점을잃었을때발생
InputEvent 클래스 InputEvent Component 클래스로부터상속받은추상클래스이며, 하위클래스로서 KeyEvent 과 MouseEvent 클래스를가진다. 메서드
ItemEvent 클래스 체크박스나리스트항목이선택되었을때또는메뉴의한항목이선택되었거나선택된항목이해제될때자동적으로객체를생성시키는클래스 메서드
KeyEvent 클래스 키보드로부터입력이일어날때자동적으로객체를생성시키는클래스 메서드 char getkeychar()
MouseEvent 클래스 사용자가마우스를누를때, 클릭할때또는드래그할때자동적으로객체를생성시키는클래스 메서드
WindowEvent 클래스 윈도우가활성화되거나아이콘화될때또는닫혀질때자동적으로객체를생성시키는클래스 메서드 Window getwindow()
이벤트핸들러 이벤트핸들러는사용자가컴포넌트에발생시킨이벤트를처리하는메소드를포함한클래스 자바에서이러한클래스 ( 이벤트핸들러 ) 는사용자가임의로작성하는것이아니라, AWT 컴포넌트에서발생가능한이벤트를처리하는메소드를미리정의해놓은리스너인터페이스를이용함 Button 컴포넌트에마우스가눌려졌을때는 ActionListener 리스너인터페이스를통해처리 모든 Event 클래스에해당하는 Listener 인터페이스가존재함
ActionListener 예 ActionListener.java public interface ActionListener { public void actionperformed(actionevent ae); Button 컴포넌트가눌려졌을때이메서드를오버라이딩하여처리되는기능을작성한다. 매개변수로 ActionEvent 클래스의객체가전달된다. 따라서구현된메소드에서는 ActionEvent 클래스에서정의한메서드의사용이가능하다. ButtonPressEvent.java class ButtonPressEvent implements ActionListener { public void actionperformed(actionevent ae) System.out.println(ae.getActionCommand()+" 버튼이눌려졌습니다."); 사용자가마우스를누르면자동적으로 ActionEvent 객체 ae 가생성되고, ButtonPressEvent 클래스의 actionperformed() 메서드를실행한다. 따라서 ActionEvent 클래스에서지원하는 getactioncommand() 메서드를호출할수있다.
이벤트프로그램작성 별도로이벤트핸들러 ( 클래스 ) 를작성하는방법 이벤트핸들러를이벤트소스에포함하도록클래스를작성하는방법 Adapter 클래스를사용하는방법 내부클래스를이용하는방법
별도이벤트핸들러작성 이벤트핸들러를별도의클래스로작성하여다른클래스의컴포넌트에서발생된이벤트를처리하는방법 프로그래밍과정 1 단계 : 이벤트컴포넌트의선정및처리할이벤트결정, 예를들어마우스가버튼객체에눌려진이벤트를처리하기위해서는 ActionEvent 를선택 2 단계 : 이벤트핸들러 ( 클래스 ) 의프로그래밍 3 단계 : 이벤트소스와이벤트핸들러 ( 클래스 ) 의연결
이벤트핸들러프로그래밍 이벤트클래스에해당하는리스너인터페이스를구현한이벤트핸들러를작성. 예를들면, 마우스가 Button 컴포넌트에눌려졌을때 MouseListener 인터페이스를이용 구현예 ButtonPressEvent.java class ButtonPressEvent implements MouseListener { Button 객체를누르면자동으로실행되는메소드. public void mousepressed(mouseevent me){ System.out.println("( "me.getx()+","+me.gety()+" ) 좌표가눌려졌습니다."); MouseEvent 클래스에서지원하는메소드 public void mouseclicked(mouseevent me) // 최소한 { 로표현해야한다. public void mouseentered(mouseevent me){ // { 이없으면추상메소드이다. public void mouseexited(mouseevent me){ public void mousereleased(mouseevent me){
이벤트소스와이벤트핸들러연결 두번째단계에서작성한이벤트핸들러를사용하기위해서는이벤트소스와이벤트핸들러를연결시켜야함. 이러한연결작업은 addxxxlistener() 메소드를사용. 여기서 XXX는이벤트클래스의이름 연결과정 (Button 컴포넌트연결 ) 1단계 : 이벤트소스에해당하는객체를생성한다. 예 ) Button button = new Button(); 2단계 : 이벤트핸들러로부터객체를생성한다. 예 ) ButtonPressEvent be = new ButtonPressEvent(); 3단계 : 이벤트소스와이벤트핸들러를 [ 이벤트소스객체.addXXXListener ( 이벤트핸들러객체 )] 의형식에의하여연결한다. 예 ) button.addactionlistener(be); 4단계 : 마지막으로 add() 메소드를사용하여이벤트소스객체를관련된프레임에등록한다. 예 ) add(button); // 현재의프레임에 button 객체를등록한다.
import java.awt.*; import java.awt.event.*; public class ButtonPress extends Frame { Button b1, b2; Label lbl; public ButtonPress(String str){ super(str); setlayout(new FlowLayout()); b1 = new Button(" 시작 "); b2 = new Button(" 종료 "); lbl = new Label(" 초기상태를보여줍니다."); ButtonHandler bh = new ButtonHandler(lbl); b1.addactionlistener(bh); b2.addactionlistener(bh); add(b1); ButtonPress.java Button 객체를생성한다. 이벤트핸들러객체를생성한다. 이벤트소스 (b1 버튼 ) 와핸들러를연결한다. add(b2); add(lbl); addwindowlistener(new WinListener()); // 프레임과핸들러연결 이벤트핸들러와연결된버튼을프레임에부착한다. public static void main(string args[]){ ButtonPress fr = new ButtonPress(" 버튼이벤트예제 "); fr.setsize(250, 130); fr.setvisible(true); class WinListener extends WindowAdapter { public void windowclosing(windowevent we){ System.exit(0);
ButtonPress.java class ButtonHandler implements ActionListener { 이벤트핸들러 Label label; public ButtonHandler(Label lbl){ label = lbl; 마우스가눌려지면자동으로처리되는메소드. ActionEvent 객체 ae는자동으로생성된다. public void actionperformed(actionevent ae){ Button b = (Button)ae.getSource(); // b는눌려진버튼의객체이다. if(b.getlabel().equals(" 시작 ")) 눌려진버튼의이름을화면에출력한다. label.settext(" 시작버튼이눌려졌습니다."); else if(b.getlabel().equals(" 종료 ")) label.settext(" 종료버튼이눌려졌습니다."); 실행결과
MousePlay.java import java.awt.*; import java.awt.event.*; public class MousePlay extends Frame { Label lbl; public MousePlay(String str) { super(str); setlayout(new FlowLayout()); lbl=new Label( 초기상태를보여줍니다. ):; MouseHandler mh=new MouseHandler(lbl); // 핸들러객체생성 add(lbl); // 이벤트소스와핸들러연결 addmouselistener(new WinListener()); // 프레임과핸들러연결 addwindowlistener(new WinListener()); public static void main(string args[]) { MousePlay fr=new MousePlay( 마우스이벤트예제 ); fr.setsize(250, 130); fr.setvisible(true); class WinListener extends WindowAdapter { public void windowclosing(windowevent we) { System.exit(0); class MouseHandler implements MouseListener { String msg; Label label; public MouseHandler(Label lbl){ label = lbl; public void mouseclicked(mouseevent me){ msg=" 좌표 ("+me.getx()+", "+me.gety()+")"+" 에서마우스클릭 "; label.settext(msg); public void mouseentered(mouseevent me){ msg=" 마우스가프레임안으로이동 "; label.settext(msg); public void mouseexited(mouseevent me){ msg=" 마우스가프레임밖으로이동 "; label.settext(msg); public void mousepressed(mouseevent me){ msg=" 좌표 ("+me.getx()+", "+me.gety()+")"+" 에서마우스가눌려짐 "; label.settext(msg); public void mousereleased(mouseevent me){ msg=" 좌표 ("+me.getx()+", "+me.gety()+")"+" 에서마우스를릴리즈 "; label.settext(msg);
이벤트핸들러를이벤트소스에포함하도록클래스를작성하는방법 이벤트소스를포함한클래스에 이벤트핸들러를포함시켜서이벤트핸들러에서모든멤버변수를접근하는것 발생하는이벤트와관련된리스너인터페이스구현
EventIncluding.java import java.awt.*; import java.awt.event.*; public class EventIncluding extends Frame implements ActionListener { Button b1, b2; Label label; public EventIncluding(String str) { super(str); setlayout(new FlowLayout()); b1 = new Button( 시작 ); b2 = new Button( 종료 ); lbl=new Label( 초기상태를보여줍니다. ):; b1.addactionlistener(this); b2.addactionlistener(this); add(b1); add(b2); add(lbl); addwindowlistener(new WinListener()); public static void main(string args[]) { MousePlay fr=new EventIncluding( 버튼이벤트예제 ); fr.setsize(250, 130); fr.setvisible(true); class WinListener extends WindowAdapter { public void windowclosing(windowevent we) { System.exit(0); public void actionperformed(actionevent ae) { Button b = (Button) ae.getstring(); if (b.getlabel() equals( 시작 )) label.settext( 시작버튼이눌려졌음 ); else if (b.getlabel() equals( 종료 )) label.settext( 종료버튼이눌려졌음 );
Adaptor 클래스를사용하는방법 리스터인터페이스사용 정의한모든메서드구현 ( 사용하지않는메서드도선언해야함 ) 해당인터페이스를구현한 Adaptor 클래스사용 사용하고자하는메서드만구현
컴포넌트이벤트처리 주요한컴포넌트에서어떤이벤트가중요한가? 각컴포넌트에서발생하는이벤트처리를어떻게 하는가? 주요컨포넌트 TextField (TextEvent, KeyEvent) Checkbox (ItemEvent) Choice (ItemEvent) Menu (ActionEvent)