자바의이벤트처리 배효철 th1g@nate.com 1
목차 이벤트기반프로그래밍 자바의이벤트기반 GUI 응용프로그램구성 이벤트객체 이벤트리스너 어댑터클래스 Key Event Mouse Event 2
이벤트기반프로그래밍 이벤트기반프로그래밍 (Event Driven Programming) 이벤트의발생에의해프로그램흐름이결정되는방식 이벤트가발생하면이벤트를처리하는루틴 ( 이벤트리스너 ) 실행 프로그램내의어떤코드가언제실행될지아무도모름, 이벤트의발생에의해전적으로결정 반대되는개념 : 배치실행 (batch programming) 프로그램의개발자가프로그램의흐름을결정하는방식 이벤트종류 사용자의입력 : 마우스드래그, 마우스클릭, 키보드누름등 센서로부터의입력, 네트워크로부터데이타송수신 다른응용프로그램이나다른스레드로부터의메시지 3
이벤트기반프로그래밍 이벤트기반프로그램의구조 이벤트처리리스너들의집합 이벤트처리순서 이벤트발생 ( 예 : 마우스나키보드의움직임혹은입력 ) 이벤트객체생성 현재발생한이벤트에대한정보를가진객체 이벤트리스너찾기 이벤트리스너호출 이벤트객체가리스너에전달됨 이벤트리스너실행 4
이벤트의실제예 마우스로메뉴선택 (Mouse Event, Action Event) 마우스로버튼클릭 (Mouse Event, Action Event) 마우스로윈도우크기조절 (Mouse Event, Container Event) 키보드입력 (Key Event) 키보드로메뉴선택 (Key Event, Action Event) 5
자바의이벤트기반 GUI 응용프로그램구성 6
이벤트객체 이벤트객체란? 이벤트가발생할때, 발생한이벤트에관한정보를가진객체 이벤트리스너에전달됨 이벤트리스너코드에서이벤트가발생한상황을파악할수있게함 이벤트객체의종류 java.util.eventobject EventObject java.awt.awtevent AWTEvent ListSelectionEvent javax.swing.event.listselectionevent java.awt.event.* ActionEvent AdjustmentEvent ComponentEvent ItemEvent TextEvent ContainerEvent FocusEvent InputEvent PaintEvent WindowEvent MouseEvent KeyEvent 7
이벤트객체에포함된정보 이벤트객체가포함하는정보 이벤트종류 이벤트소스 이벤트가발생한화면좌표 이벤트가발생한컴포넌트내좌표 버튼이나메뉴아이템에이벤트가발생한경우버튼이나메뉴아이템의문자열 클릭된마우스버튼번호 마우스의클릭횟수 키가눌러졌다면키의코드값과문자값 체크박스, 라디오버튼등과같은컴포넌트에이벤트가발생하였다면체크상태 이벤트에따라조금씩다른정보포함 ActionEvent 객체 : 액션문자열 MouseEvent 객체 : 마우스의위치정보, 마우스버튼, 함께눌러진키정보등 ItemEvent 객체 : 아이템의체크상태 이벤트소스알아내기 Object EventObject.getSource() 발생한이벤트의소스컴포넌트리턴 Object 타입으로리턴하므로캐스팅하여사용 모든이벤트객체에대해적용 8
이벤트객체의메소드 EventObject Object getsource() AWTEvent ActionEvent String getactioncommand() ComponentEvent InputEvent int getmodifiers() ItemEvent Object getitem() int getstatechange() MouseEvent int getbutton() int getclickcount() Point getpoint() int getx() int gety() KeyEvent char getkeychar() int getkeycode() String getkeytext() 9
이벤트객체와이벤트소스 10
이벤트리스너 이벤트리스너 (Event Listener) 란? 11 이벤트를처리하는코드 클래스로작성 JDK 에서이벤트리스너작성을위한인터페이스제공 개발자가리스너인터페이스의추상메소드구현 이벤트가발생하면자바플랫폼은리스너인터페이스의추상메소드호출 예 ) ActionListener 인터페이스 interface ActionListener { // 아래메소드를개발자가구현해야함 public void actionperformed(actionevent e); // Action 이벤트발생시호출됨 예 ) MouseListener 인터페이스 interface MouseListener { // 아래의 5 개메소드를개발자가구현해야함 public void mousepressed(mouseevent e); // 마우스버튼이눌러지는순간호출 public void mousereleased(mouseevent e); // 눌러진마우스버튼이떼어지는순간호출 public void mouseclicked(mouseevent e); // 마우스가클릭되는순간호출 public void mouseentered(mouseevent e); // 마우스가컴포넌트위에올라가는순간호출 public void mouseexited(mouseevent e); // 마우스가컴포넌트위에서내려오는순간호출
이벤트리스너등록 이벤트리스너등록 이벤트를받아처리하고자하는컴포넌트에이벤트리스너등록 이벤트리스너등록메소드 Component.addXXXListener(listener) xxx : 이벤트명 listener : 이벤트리스너객체 예 ) addmouselistener(), addactionlistener(), addfocuslistener() 등 이벤트리스너가등록된컴포넌트에만이벤트전달 이벤트리스너가등록된컴포넌트만이벤트리스너코드작동 12
리스너인터페이스와메소드 13
이벤트리스너작성예 import javax.swing.*; import java.awt.event.*; import java.awt.*; Action 이벤트리스너객체생성 Action 이벤트리스너등록 버튼의문자열변경 public class ListenerSample extends JFrame { ListenerSample () { settitle("action 이벤트리스너작성 "); setlayout(new FlowLayout()); setdefaultcloseoperation(jframe.exit_on_close); JButton btn = new JButton("Action"); MyActionListener listener = new MyActionListener (); btn.addactionlistener(listener ); add(btn); setsize(300,150); setvisible(true); public static void main(string [] args) { new ListenerSample (); class MyActionListener implements ActionListener { public void actionperformed(actionevent e) { JButton b = (JButton)e.getSource(); if(b.gettext().equals("action")) b.settext(" 액션 "); else b.settext("action); 이벤트리스너등록 이벤트리스너구현 14
이벤트리스너작성예 15 초기상태 마우스가버튼에올라갈때 마우스가버튼에서내려올때 import javax.swing.*; import java.awt.event.*; import java.awt.*; public class ListenerMouseEx extends JFrame { ListenerMouseEx() { settitle(" 버튼에 Mouse 이벤트리스너작성 "); setlayout(new FlowLayout()); setdefaultcloseoperation(jframe.exit_on_close); JButton btn = new JButton("Mouse Event 테스트버튼 "); btn.setbackground(color.yellow); MyMouseListener listener = new MyMouseListener(); btn.addmouselistener(listener); add(btn); setsize(300,150); setvisible(true); public static void main(string [] args) { new ListenerMouseEx(); class MyMouseListener implements MouseListener { public void mouseentered(mouseevent e) { JButton btn = (JButton)e.getSource(); btn.setbackground(color.red); public void mouseexited(mouseevent e) { JButton btn = (JButton)e.getSource(); btn.setbackground(color.yellow); public void mousepressed(mouseevent e) { public void mousereleased(mouseevent e) { public void mouseclicked(mouseevent e) {
Tip 컴포넌트는다른이벤트에대한리스너를동시에가질수있다. JButton.addActionListener(); // Action 리스너 JButton.addKeyListener(); // Key 리스너 JButton.addFocusListener(); // Focus 리스너 컴포넌트는한이벤트에대해여러개의리스너를동시에가질수있다. JButton.addActionListener(new MyButtonListener1()); JButton.addActionListener(new MyButtonListener2()); JButton.addActionListener(new MyButtonListener3()); 이때, 리스너는등록된반대순으로모두실행된다. 16
이벤트리스너작성방법 3 가지방법 독립클래스로작성 이벤트리스너를완전한클래스로작성 이벤트리스너를여러곳에서사용할때적합 내부클래스 (inner class) 로작성 클래스안에멤버처럼클래스작성 이벤트리스너를특정클래스에서만사용할때적합 익명클래스 (anonymous class) 로작성 클래스의이름없이간단히리스너작성 클래스조차만들필요없이리스너코드가간단한경우에적합 17
독립클래스로리스너작성 독립된클래스로 Action 이벤트리스너작성 이클래스를별도의 MyActionListener.java 파일로작성하여도됨 import javax.swing.*; import java.awt.event.*; import java.awt.*; public class IndepClassListener extends JFrame { IndepClassListener() { settitle("action 이벤트리스너작성 "); setlayout(new FlowLayout()); setdefaultcloseoperation(jframe.exit_on_close); setsize(300,150); setvisible(true); JButton btn = new JButton("Action"); MyActionListener listener = new MyActionListener(); btn.addactionlistener(listener); add(btn); public static void main(string [] args) { new IndepClassListener(); class MyActionListener implements ActionListener { public void actionperformed(actionevent e) { JButton b = (JButton)e.getSource(); if(b.gettext().equals("action")) b.settext(" 액션 "); else b.settext("action"); 18
내부클래스로리스너작성 Action 이벤트리스너를내부클래스로작성 private 으로선언하여 InnerClassListener 의외부에서사용할수없게함 리스너에서 InnerClassListener 의멤버에대한접근용이 import javax.swing.*; import java.awt.event.*; import java.awt.*; public class InnerClassListener extends JFrame { InnerClassListener() { settitle("action 이벤트리스너작성 "); setlayout(new FlowLayout()); setdefaultcloseoperation(jframe.exit_on_close); setsize(300,300); setvisible(true); JButton btn = new JButton("Action"); btn.addactionlistener(new MyActionListener()); add(btn); private class MyActionListener implements ActionListener { public void actionperformed(actionevent e) { JButton b = (JButton)e.getSource(); if(b.gettext().equals("action")) b.settext(" 액션 "); else b.settext("action"); // InnerClassListener의멤버나 JFrame의멤버를호출할수있음 settitle(b.gettext()); // JFrame.setTitle() 호출 public static void main(string [] args) { new InnerClassListener(); 19
익명클래스로이벤트리스너작성 익명클래스란? ( 클래스정의 + 인스턴스생성 ) 을한번에작성 ActionListener 를구현하는익명의이벤트리스너작성예 클래스선언 new 익명클래스의수퍼클래스이름 ( 생성자의인자들 ) {... 멤버구현... ; class MyActionListener implements ActionListener { public void actionperformed(actionevent e) {... 메소드구현... new MyActionListener (); 클래스인스턴스생성 익명클래스탄생 ( 클래스선언과인스턴스생성을동시에 ) new ActionListener() { public void actionperformed(actionevent e) {... 메소드구현... ; 20
익명클래스로이벤트리스너작성 익명클래스로다시작성된결과 btn.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { JButton b = (JButton)e.getSource(); if(b.gettext().equals("action")) b.settext(" 액션 "); else b.settext("action"); // AnonymousClassListener 의멤버나 // JFrame 의멤버를호출할수있음 settitle(b.gettext()); ); import javax.swing.*; import java.awt.event.*; import java.awt.*; public class AnonymousClassListener extends JFrame { AnonymousClassListener() { settitle("action 이벤트리스너작성 "); setdefaultcloseoperation(jframe.exit_on_close); setlayout(new FlowLayout()); setsize(300,300); setvisible(true); JButton btn = new JButton("Action"); add(btn); btn.addactionlistener(new MyActionListener() ); private class MyActionListener implements ActionListener { public void actionperformed(actionevent e) { JButton b = (JButton)e.getSource(); if(b.gettext().equals("action")) b.settext(" 액션 "); else b.settext("action"); // InnerClassListener의멤버나 JFrame 멤버호출가능 settitle(b.gettext()); public static void main(string [] args) { new AnonymousClassListener (); 21 간단한리스너의경우익명클래스사용추천. 메소드의개수가 1, 2 개인리스너 (ActionListener, ItemListener) 에대해주로사용
예제 프레임상의임의의위치에마우스버튼을누르면마우스포인트가있는위치로 "hello" 문자열을이동시키는스윙응용프로그램을작성하라 초기화면마우스다른곳에클릭한경우마우스다른곳에클릭한경우 22 마우스버튼을누르면마우스가있는위치로 "hello" 문자열을이동시킨다. 이벤트와리스너 : MouseEvent 와 MouseListener 이벤트소스 : JPanel 구현할리스너의메소드 : mousepressed() "hello" 문자열 : JLabel 컴포넌트이용 컨텐트팬 : JPanel 로교체, 배치관리자를 null 로설정
예제 import javax.swing.*; import java.awt.event.*; import java.awt.*; public class MouseListenerEx extends JFrame { JLabel la; MouseListenerEx() { settitle("mouse 이벤트예제 "); setdefaultcloseoperation(jframe.exit_on_close); JPanel contentpane = new JPanel(); setcontentpane(contentpane); setlayout(null); contentpane.addmouselistener(new MyMouseListener()); la = new JLabel("hello"); la.setsize(50, 20); la.setlocation(30, 30); contentpane.add(la); 마우스버튼이눌러진위치를알아내어 la("hello" 문자열 ) 를그위치로옮긴다. class MyMouseListener implements MouseListener { public void mousepressed(mouseevent e) { int x = e.getx(); int y = e.gety(); la.setlocation(x, y); public void mousereleased(mouseevent e) { public void mouseclicked(mouseevent e) { public void mouseentered(mouseevent e) { public void mouseexited(mouseevent e) { public static void main(string [] args) { new MouseListenerEx(); setsize(200,200); setvisible(true); 23
어댑터 (Adapter) 클래스 이벤트리스너구현에따른부담 리스너의추상메소드들을모두구현해야하는부담 마우스리스너에서마우스가눌러지는경우 (mousepressed()) 만처리하고자하는경우에도나머지 4 개의메소드를모두구현해야하는부담 어댑터클래스 JDK 에서제공 리스너의모든메소드가단순리턴하도록구현해놓은클래스 MouseAdapter 예 class MouseAdapter implements MouseListener { public void mousepressed(mouseevent e) { public void mousereleased(mouseevent e) { public void mouseclicked(mouseevent e) { public void mouseentered(mouseevent e) { public void mouseexited(mouseevent e) { 추상메소드가하나뿐인리스너는어댑터없음 ActionAdapter, ItemAdapter 클래스는존재하지않음 24
어댑터 (Adapter) 클래스 JDK 에서제공하는어댑터클래스 25
어댑터사용예 JLabel la; JPanel contentpane = new JPanel(); contentpane.addmouselistener(new MyMouseListener());.. class MyMouseListener implements MouseListener { public void mousepressed(mouseevent e) { int x = e.getx(); int y = e.gety(); la.setlocation(x, y); public void mousereleased(mouseevent e) { public void mouseclicked(mouseevent e) { public void mouseentered(mouseevent e) { public void mouseexited(mouseevent e) { JLabel la; JPanel contentpane = new JPanel(); contentpane.addmouselistener(new MyMouseAdapter());.. class MyMouseAdapter extends MouseAdapter { public void mousepressed(mouseevent e) { int x = e.getx(); int y = e.gety(); la.setlocation(x, y); MouseAdapter 를이용한경우 MouseListener 를이용한경우 26
어댑터사용예 마우스클릭에따른 hello 이동예제를변경 import javax.swing.*; import java.awt.event.*; import java.awt.*; public class MouseAdapterEx extends JFrame { JPanel contentpane = new JPanel(); JLabel la; class MyMouseAdapter extends MouseAdapter { public void mousepressed(mouseevent e) { int x = e.getx(); int y = e.gety(); la.setlocation(x, y); MouseAdapterEx() { settitle("mouse 이벤트예제 "); setdefaultcloseoperation(jframe.exit_on_close); setcontentpane(contentpane); setlayout(null); contentpane.addmouselistener(new MyMouseAdapter()); la = new JLabel("hello"); la.setsize(50, 20); la.setlocation(30, 30); contentpane.add(la); setsize(200,200); setvisible(true); public static void main(string [] args) { new MouseAdapterEx(); 27
Key 이벤트와포커스 키입력시, 다음세경우에 Key 이벤트발생 키를누르는순간 누른키를떼는순간 누른키를떼는순간 (Unicode 키의경우에만 ) 키이벤트를받을수있는조건 모든컴포넌트가능하지만, 현재포커스 (focus) 를가진컴포넌트 포커스 (focus) 컴포넌트나응용프로그램이키이벤트를독점하는권한 컴포넌트에포커스설정방법 component.requestfocus(); // component 가키이벤트를받을수있게함 28
KeyListener 의메소드와키 KeyListener 의 3 개메소드 컴포넌트 키를누르는순간 누른키를떼는순간 누른키를떼는순간, Unicode 키가입력된경우에만 void keypressed(keyevent e) { // 이벤트처리루틴 void keyreleased(keyevent e) { // 이벤트처리루틴 void keytyped(keyevent e) { // 이벤트처리루틴 KeyListener 의메소드가실행되는순서 컴포넌트에키이벤트리스너등록 component.addkeylistener(mykeylistener); 29
유니코드 (Unicode) 유니코드키의특징 국제산업표준 전세계의문자를컴퓨터에서일관되게표현하기위한코드체계 문자들에대해서만코드값정의 A~Z, a~z, 0~9,!, @, & 등 문자키가아닌경우에는통일된키코드값없음 <Function> 키, <Home> 키, <Up> 키,<Delete> 키, <Control> 키, <Shift> 키, <Alt> 등 플랫폼에따라키코드값이다를수있음 유니코드키가아닌경우 keypressed(), keyreleased() 만호출됨 유니코드키가입력되는경우 keypressed(), keytyped(), keyreleased() 가순서대로호출 30
입력된키판별 KeyEvent 객체 키가입력되면입력된키정보를가진이벤트객체생성 : KeyEvent 객체 KeyEvent 객체가리스너에전달됨 KeyEvent 객체의메소드로입력된키판별 Unicode 키의문자값판별, char KeyEvent.getKeyChar() 눌러진키에해당하는문자값리턴 눌러진키가 Unicode 문자키인경우에만의미있음 Unicode 문자뿐아니라모든키판별, int KeyEvent.getKeyCode() 눌러진키에대한정수형키코드값리턴 Unicode 문자에관계없이, Function 키, Modifier(shift) 키, Control 키, Action 키등모든키에대해키코드값리턴 운영체제나하드웨어에따라키셋은서로다름 입력된키를판별하기위해가상키 (Virtual Key) 값과비교하여야함 가상키값은 KeyEvent 클래스의상수로정의됨 키이름문자열리턴 String KeyEvent.getKeyText(int keycode) static 메소드 keycode 의코드값에해당하는키이름문자열리턴 F1 키의경우 "F1", Shift 키의경우 "SHIFT" 등의문자열리턴 31
가상키 (Virtual Key) 가상키는 KeyEvent 클래스에상수로선언 가상키의일부분사례 32
KeyListener 의메소드와키 33
KeyListener 예 import javax.swing.*; import java.awt.event.*; import java.awt.*; public class KeyListenerEx extends JFrame { JPanel contentpane = new JPanel(); JLabel [] keymessage; KeyListenerEx() { settitle("keylistener 예제 "); setdefaultcloseoperation(jframe.exit_on_close); setcontentpane(contentpane); contentpane.addkeylistener(new MyKeyListener()); keymessage = new JLabel [3]; keymessage[0] = new JLabel(" getkeycode() "); keymessage[1] = new JLabel(" getkeychar() "); keymessage[2] = new JLabel(" getkeytext() "); for(int i=0; i<keymessage.length; i++) { contentpane.add(keymessage[i]); keymessage[i].setopaque(true); keymessage[i].setbackground(color.cyan); setsize(300,150); setvisible(true); contentpane.requestfocus(); class MyKeyListener extends KeyAdapter { public void keypressed(keyevent e) { int keycode = e.getkeycode(); char keychar = e.getkeychar(); keymessage[0].settext(integer.tostring(keycode)); keymessage[1].settext(character.tostring(keychar)); keymessage[2].settext(e.getkeytext(keycode)); public static void main(string [] args) { new KeyListenerEx(); JComponent 컴포넌트에바탕색을지정하기위해서는사전에컴포넌트가불투명함을지정하여야한다. 34
KeyListener 예 초기화면 <Control> 키입력 w 키입력 <F1> 키입력 키 9 의키코드 키 9 의유니코드문자 키 9 의이름문자열 <Home> 키코드 <Home> 키에대응하는문자없음 <Home> 키의이름문자열 35
KeyListener 예 import javax.swing.*; import java.awt.event.*; import java.awt.*; public class KeyCodeEx extends JFrame { JPanel contentpane = new JPanel(); JLabel la = new JLabel(); KeyCodeEx() { settitle("key Code 예제 : F1 키 : 초록색, % 키노란색 "); setdefaultcloseoperation(jframe.exit_on_close); setcontentpane(contentpane); contentpane.addkeylistener(new MyKeyListener()); contentpane.add(la); setsize(300,150); setvisible(true); contentpane.requestfocus(); class MyKeyListener extends KeyAdapter { public void keypressed(keyevent e) { la.settext(e.getkeytext(e.getkeycode())); if(e.getkeychar() == '%') contentpane.setbackground(color.yellow); else if(e.getkeycode() == KeyEvent.VK_F1) contentpane.setbackground(color.green); public static void main(string [] args) { new KeyCodeEx(); % 키를판별하기위해 e.getkeychar() 이용 '%' 문자와비교 JPanel 이키입력을받을수있도록포커스를준다. F1 키를판별하기위해 e.getkeycode() 이용 KeyEvent.VK_F1 값과비교 36
KeyListener 예 %(Shift+5) 키가입력된경우로배경이노란색으로변경되었다. % 는 Shift 키 +5 키이므로최종적으로는 5 키에대한문자열이출력 키 5 를누른경우로서노란색배경으로변하지않는다. 37
KeyListener 예 상, 하, 좌, 우키를이용하여아래그림과같이 "HELLO" 문자열을화면에서움직이는응용프로그램을작성하라. "HELLO" 문자열은 JLabel 컴포넌트로생성하여컨텐트팬에부착하고상, 하, 좌, 우키를움직이면키방향으로한번에 10 픽셀씩움직인다. 이를위해컨텐트팬의배치관리자를삭제하여야한다. 아래그림은초기 "HELLO" 문자열을 (50, 50) 위치에출력하고키를입력함에따라키방향으로문자열이움직이는화면이다. 상, 하, 좌, 우키를움직이면한번에 10 픽셀씩 "HELLO" 텍스트는상, 하, 좌, 우로이동한다. 이텍스트는프레임의영역을벗어나서움직일수있다. 38
KeyListener 예 import javax.swing.*; import java.awt.event.*; import java.awt.*; public class FlyingTextEx extends JFrame { JPanel contentpane = new JPanel(); JLabel la = new JLabel("HELLO"); final int FLYING_UNIT = 10; FlyingTextEx() { settitle(" 상, 하, 좌, 우키를이용하여텍스트움직이기 "); setdefaultcloseoperation( JFrame.EXIT_ON_CLOSE); setcontentpane(contentpane); contentpane.setlayout(null); contentpane.addkeylistener(new MyKeyListener()); la.setlocation(50,50); la.setsize(100,20); contentpane.add(la); setsize(300,300); setvisible(true); contentpane.requestfocus(); class MyKeyListener extends KeyAdapter { public void keypressed(keyevent e) { int keycode = e.getkeycode(); switch(keycode) { case KeyEvent.VK_UP: la.setlocation(la.getx(), la.gety()-flying_unit); break; case KeyEvent.VK_DOWN: la.setlocation(la.getx(), la.gety()+flying_unit); break; case KeyEvent.VK_LEFT: la.setlocation(la.getx()-flying_unit, la.gety()); break; case KeyEvent.VK_RIGHT: la.setlocation(la.getx()+flying_unit, la.gety()); break; public static void main(string [] args) { new FlyingTextEx(); 39
MouseEvent Mouse 이벤트 : 사용자의마우스조작에따라발생하는이벤트 mouseclicked() : 마우스가눌러진위치에서그대로떼어질때호출 mousereleased() : 마우스가눌러진위치에서그대로떼어지든아니든항상호출 mousedragged(): 마우스가드래그되는동안계속여러번호출 마우스가눌러진위치에서떼어지는경우메소드호출순서 mousepressed(), mousereleased(), mouseclicked() 마우스가드래그될때호출되는메소드호출순서 mousepressed(), mousedragged(), mousedragged(),..., mousedragged(), mousereleased() 40
MouseEvent MouseEvent 로부터얻을수있는정보 마우스포인터의위치 int getx(), int gety(), Point getpoint() public void mousepressed(mouseevent e) { int x = e.getx(); int y = e.gety(); 입력된마우스버튼 short getbutton() 마우스클릭횟수 int getclickcount() 팝업메뉴클릭 boolean ispopuptrigger() public void mousepressed(mouseevent e) { if(e.getbutton() == MouseEvent.BUTTON1) System.out.println("Left Button Pressed"); public void mouseclicked(mouseevent e) { if(e.getclickcount() == 2) { // 더블클릭을처리하는루틴 41
MouseListener 예 import javax.swing.*; import java.awt.event.*; import java.awt.*; public class MouseListenerAllEx extends JFrame { JPanel contentpane = new JPanel(); JLabel la; MouseListenerAllEx() { settitle("mouselistener 와 MouseMOtionListener 예제 "); setdefaultcloseoperation(jframe.exit_on_close); setcontentpane(contentpane); contentpane.addmouselistener( new MyMouseListener()); contentpane.addmousemotionlistener( new MyMouseListener()); la = new JLabel("No Mouse Event"); contentpane.add(la); setsize(300,200); setvisible(true); class MyMouseListener implements MouseListener, MouseMotionListener { public void mousepressed(mouseevent e) { la.settext("mousepressed ("+e.getx()+","+e.gety()+")"); public void mousereleased(mouseevent e) { la.settext("mousereleased("+e.getx()+","+e.gety()+")"); public void mouseclicked(mouseevent e) { public void mouseentered(mouseevent e) { JPanel p = (JPanel)e.getSource(); p.setbackground(color.cyan); public void mouseexited(mouseevent e) { JPanel p = (JPanel)e.getSource(); p.setbackground(color.yellow); public void mousedragged(mouseevent e) { la.settext("mousedragged ("+e.getx()+","+e.gety()+")"); public void mousemoved(mouseevent e) { la.settext("mousemoved ("+e.getx()+","+e.gety()+")"); public static void main(string [] args) { new MouseListenerAllEx(); 42
MouseListener 예 (20,92) (257,109) 초기화면 mouseentered() 에의해배경색변경. 마우스버튼이눌러진순간 눌러진마우스버튼이떼어진순간 (162,89) (127,72) 마우스가패널위에이동하는동안 마우스가패널위에드래깅하는동안 마우스가패널바깥으로나가면 mouseexited() 에의해배경색변경 43
MouseListener 예 import javax.swing.*; import java.awt.event.*; import java.awt.*; public class ClickAndDoubleClickEx extends JFrame { JPanel contentpane = new JPanel(); ClickAndDoubleClickEx() { settitle("click and DoubleClick 예제 "); setdefaultcloseoperation(jframe.exit_on_close); setcontentpane(contentpane); contentpane.addmouselistener(new MyMouseListener()); setsize(300,200); setvisible(true); class MyMouseListener extends MouseAdapter { public void mouseclicked(mouseevent e) { if(e.getclickcount() == 2) { int r = (int)(math.random()*256); int g = (int)(math.random()*256); int b = (int)(math.random()*256); JPanel p = (JPanel)e.getSource(); p.setbackground(new Color(r,b,g)); public static void main(string [] args) { new ClickAndDoubleClickEx(); 44