Power Java 제 18 장이벤트처리 이번장에서학습할내용 이벤트처리의개요 이벤트 액션이벤트 Key, Mouse, MouseMotion 어댑터클래스 버튼을누르면반응하도록만들어봅시다.
이번장의목표 버튼을누르면버튼의텍스트가변경되게한다. 이벤트처리과정
이벤트처리과정 (1) 이벤트를발생하는컴포넌트를생성하여야한다. 이벤트처리과정 (2) 이벤트리스너클래스를작성한다.
이벤트처리과정 (3) 이벤트리스너를이벤트소스에등록한다. 이벤트리스너를컴포넌트에붙인다. 프로그램결과
이벤트처리기를어디에 (1) 별도의클래스로이벤트처리기를작성 : 앞의예제 이벤트처리기의위치 (2) 내부클래스로이벤트처리기를작성 (3) 프레임클래스가이벤트처리기도함께구현 내부클래스사용방법 만약 MyListener 라는클래스를별도의클래스로하면 MyFrame 안의멤버변수들을쉽게사용할수없다. 일반적으로 MyListener 클래스를내부클래스로만든다.
내부클래스를사용하는버전 import javax.swing.*; import java.awt.event.*; public class MyFrame extends JFrame { private JButton button; public MyFrame() { this.setsize(300, 200); this.setdefaultcloseoperation(jframe.exit_on_close); this.settitle(" 이벤트예제 "); JPanel panel = new JPanel(); button = new JButton(" 버튼을누르시오 "); button.addactionlistener(new MyListener()); panel.add(button); this.add(panel); this.setvisible(true); ( 내부클래스를사용하는버전 private class MyListener implements ActionListener { public void actionperformed(actionevent e) { if (e.getsource() == button) { button.settext(" 버튼이눌려졌습니다 "); public class MyFrameTest { public static void main(string[] args) { MyFrame t = new MyFrame(); 내부클래스
MyFrame 에서이벤트도처리하는방법 더많이사용되는방법은 MyFrame 클래스가 JFrame 을상속받으면서동시에 ActionListener 인터페이스도구현하는경우이다. MyFrame 이이벤트도처리 import javax.swing.*; import java.awt.event.*; 이벤트도처리 class MyFrame extends JFrame implements ActionListener { private JButton button; public MyFrame() { this.setsize(300, 200); this.setdefaultcloseoperation(jframe.exit_on_close); this.settitle(" 이벤트예제 "); JPanel panel = new JPanel(); button = new JButton(" 버튼을누르시오 "); button.addactionlistener(this); panel.add(button); this.add(panel); this.setvisible(true); (
MyFrame 이이벤트도처리 public void actionperformed(actionevent e) { if (e.getsource() == button) { button.settext(" 버튼이눌려졌습니다 "); public class MyFrameTest1 { public static void main(string[] args) { MyFrame t = new MyFrame(); 중간점검문제 1. 사용자가버튼을누르면무엇이발생하는가? 2. 이벤트를처리하는클래스를무엇이라고하는가? 3. 내부클래스를사용하는장점은무엇인가?
이벤트의분류 #1 이벤트의분류 #2 스윙컴포넌트에의하여지원되는이벤트는크게두가지의카테고리로나누어진다. 모든컴포넌트가지원하는이벤트 이벤트 일부컴포넌트가지원하는이벤트
모든컴포넌트가지원하는이벤트 일부컴포넌트가지원하는이벤트
Action 이벤트 사용자가버튼을클릭하는경우 사용자가메뉴항목을선택하는경우 사용자가텍스트필드에서엔터키를누르는경우
import javax.swing.*; import java.awt.color; import java.awt.event. awt *; 액션이벤트예제 class MyFrame extends JFrame { private JButton button1; private JButton button2; private JPanel panel; public MyFrame() { this.setsize(300, 200); this.setdefaultcloseoperation(jframe.exit_on_close); this.settitle(" 이벤트예제 "); panel = new JPanel(); button1 = new JButton(" 노란색 "); button1.addactionlistener(new MyListener()); panel.add(button1); button2 = new JButton(" 핑크색 "); button2.addactionlistener(new MyListener()); panel.add(button2); this.add(panel); this.setvisible(true); 액션이벤트예제 private class MyListener implements ActionListener { public void actionperformed(actionevent e) { if (e.getsource() == button1) { panel.setbackground(color.yellow); else if (e.getsource() == button2) { panel.setbackground(color.pink); public class MyFrameTest2 { public static void main(string[] args) { MyFrame t = new MyFrame();
결과화면 이벤트발생원의식별 getsource() 메소드를이용하여이벤트를발생시킨객체를식별한다. getid() 메소드를이용하여이벤트의타입을식별한다. getactioncommand() 메소드를이용하여이벤트를발생시킨컴포넌트이름을식별한다. public void actionperformed(actionevent e) { if (e.getsource () == button1){
Key 이벤트 KeyListener 인터페이스구현 KeyListener 인터페이스 메소드 설명 keytyped(keyevent e) 사용자가글자를입력했을경우에호출 keypressed(keyevent e) keyreleased(keyevent y e) 사용자가키를눌렀을경우에호출사용자가키에서손을떼었을경우에호출 키보드이벤트예제 import javax.swing.*; import java.awt.*; import java.awt.event.*; class MyFrame extends JFrame implements KeyListener { // (1) public MyFrame() { settitle(" 이벤트예제 "); setsize(300, 200); setdefaultcloseoperation(jframe.exit_on_close); JTextField tf = new JTextField(20); tf.addkeylistener(this); // (2) add(tf); setvisible(true); 키보드이벤트처리기를붙인다.
public void keytyped(keyevent e) { // (3) display(e, "KeyTyped "); 액션이벤트예제 public void keypressed(keyevent e) { display(e, "KeyPressed "); public void keyreleased(keyevent e) { display(e, "Key Pressed "); protected t void display(keyevent e, String s) { char c = e.getkeychar(); int keycode = e.getkeycode(); String modifiers = e.isaltdown() + " " + e.iscontroldown() + " " + e.isshiftdown(); System.out.println(s + " " + c + " " + keycode + " " + modifiers); 실행결과
Mouse 이벤트 MouseListener 인터페이스 메소드 mouseclicked(mouseevent e) mouseentered(mouseevent e) mouseexited(mouseevent e) mousepressed(mouseevent e) 설명 사용자가컴포넌트를마우스로클릭한경우에호출된다. 마우스커서가컴포넌트의경계안으로커서가들어가면호출된다. 마우스커서가컴포넌트의경계밖으로커서가나가면호출된다. 마우스가컴포넌트위에서눌려지면호출된다. mousereleased(mouseevent e) 마우스가컴포넌트위에서떼어지면호출된다. MouseMotion 이벤트 메소드 mousedragged(mouseevent e) 설명 마우스버튼을누른채로마우스를이동하는경우에호출된다. mousemoved(mouseevent e) 마우스버튼을누르지않고마우스를이동하는경우에호출된다.
마우스이벤트예제 import javax.swing.*; import java.awt.*; import java.awt.event.*; class MyFrame extends JFrame implements MouseListener, MouseMotionListener { public MyFrame() { settitle("mouse Event"); setsize(300, 200); setdefaultcloseoperation(jframe.exit_on_close); JPanel panel = new JPanel(); panel.addmouselistener(this); panel.addmousemotionlistener(this); add(panel); setvisible(true); 마우스이벤트처리기를붙인다. 마우스이벤트예제 public void mousepressed(mouseevent e) { display( ("Mouse pressed (# of clicks: " + e.getclickcount() + ")", e); public void mousereleased(mouseevent e) { display("mouse released (# of clicks: " + e.getclickcount() + ")", e); public void mouseentered(mouseevent e) { display("mouse entered", e); public void mouseexited(mouseevent e) { display("mouse exited", e); public void mouseclicked(mouseevent e) { display("mouse clicked (# of clicks: " + e.getclickcount() + ")", e);
마우스이벤트예제 protected void display(string s, MouseEvent e) { Sstemo System.out.println(s t + " X= " + e.getx() + " Y= " + e.gety()); public void mousedragged(mouseevent e) { display("mouse dragged", e); public void mousemoved(mouseevent e) { display("mouse moved", e); public class MyFrameTest5 { public static void main(string[] args) { MyFrame f=new MyFrame(); 실행결과
마우스의좌표를얻으려면? (x, y) MouseEvent 클래스 메소드 int getclickcount() int getx() int gety() Point getpoint() int getxonscreen() int getyonscreen() int getlocationonscreen() int getbutton() boolean ispopuptrigger() String getmousemodifierstext(int) 설명 빠른연속적인클릭의횟수를반환한다. 예를들어 2 이면더블클릭을의미한다. 이벤트가발생했을당시의 (x,y) 위치를반환한다. 위치는컴포넌트에상대적이다. 절대좌표값 (x,y) 을반환한다. 이들좌표값은가상화면에상대적이다. 어떤마우스버튼의상태가변경되었는지를반환한다. NOBUTTON,BUTTON1,BUTTON2,BUTTON3중의하나이다. 마우스이벤트가팝업메뉴를나타나게하면 true 를반환한다. 이벤트도중의수식키와마우스버튼을기술하는설명문을반환한다. 어댑터클래스 인터페이스의경우, 모든메소드를구현하여야한다. 어댑터클래스 (Adaptor Class) 를사용하면원하는메소드만을구현하는것이가능해진다 인터페이스 ComponentListener ContainerListener FocusListener KeyListener MouseListener MouseMotionListener WindowListener 어댑터클래스 ComponentAdapter ContainerAdapter FocusAdater KeyAdapter MouseAdapter MouseMotionAdapter WindowAdapter
리스너를사용하는경우 어댑터를사용하는경우
마우스이벤트예제 import java.awt.*; import java.awt.event.*; import javax.swing.jframe; class MyFrame extends JFrame { public MyFrame() { setsize(300, 200); settitle("my Frame"); addwindowlistener(new MyWindowAdaptor()); setvisible(true); 내부클래스정의 class MyWindowAdaptor extends WindowAdapter { public void windowclosing(windowevent e) { System.exit(0); 마우스이벤트예제 public class MyFrameTest6 { public static void main(string args[]) { MyFrame w = new MyFrame();
Q & A