1 이벤트기반프로그래밍 2 제 10 장이벤트처리 이벤트기반프로그래밍 (Event Driven Programming) 이벤트의발생에의해프로그램흐름이결정되는방식 이벤트가발생하면이벤트를처리하는루틴 ( 이벤트리스너 ) 이실행하는방식 프로그램내의어떤코드가언제실행될지아무도모름, 이벤트의발생에의해전적으로결정 반대되는개념 : 배치실행 (batch programming) 프로그램의개발자가프로그램의흐름을결정하는방식이벤트 사용자의입력 : 마우스드래그, 마우스클릭, 키보드누름 센서로부터의입력 네트워크로부터데이타송수신 다른응용프로그램이나다른스레드로부터의메시지이벤트기반프로그램의구조 프로그램에서처리하고자하는이벤트의이벤트처리리스너구현이벤트처리순서 이벤트발생 ( 예 : 마우스나키보드의움직임혹은입력 ) 이벤트객체생성 현재발생한이벤트에대한여러정보를가진객체 이벤트리스너찾기 이벤트리스너호출 event 객체가리스너에전달됨 이벤트리스너실행 이벤트의실제예 자바의이벤트기반 GUI 응용프로그램구성 3 4 JTextField 자바응용프로그램 JMenuItem JButton 이벤트소스 (JButton) JList 이베트리스너 1 이베트리스너 2 이베트리스너 3 이베트 호출리스너4 ActionEvent 생성 이벤트분배스레드 마우스로메뉴선택 (Mouse Event, Action Event) 마우스로버튼클릭 (Mouse Event, Action Event) 마우스로윈도우크기조절 (Mouse Event, Container Event) 키보드입력 (Key Event) 키보드로메뉴선택 (Key Event, Action Event) 자바가상기계 (JVM) 운영체제 PC 등하드웨어 화면상의 New 버튼에마우스클릭 발생한이벤트 : Action 이벤트이벤트소스 : JButton 이벤트객체 : ActionEvent 이벤트리스너 : 이벤트리스너 4
이벤트객체 이벤트객체에포함된정보 5 이벤트객체란? 이벤트가발생하면발생한이벤트에관한정보를가진객체 이벤트리스너에전달됨 이벤트리스에서이벤트가발생한여러상황을파악할수있게함 이벤트객체의종류 java.awt.event.* ActionEvent java.util.eventobject java.awt.awtevent AdjustmentEvent EventObject AWTEvent ComponentEvent ItemEvent TextEvent ContainerEvent FocusEvent InputEvent PaintEvent WindowEvent MouseEvent KeyEvent ListSelectionEvent javax.swing.event.listselectionevent 6 이벤트객체가포함하는정보 이벤트종류 이벤트소스 이벤트가발생한화면좌표 이벤트가발생한컴포넌트내좌표 버튼이나메뉴아이템에이벤트가발생한경우버튼이나메뉴아이템의문자열 클릭된마우스버튼번호 마우스의클릭횟수 키가눌러졌다면키의코드값과문자값 체크박스, 라디오버튼등과같은컴포넌트에이벤트가발생하였다면체크상태이벤트에따라조금씩다른정보포함 ActionEvent 객체 : 액션문자열 MouseEvent 객체 : 마우스의위치정보, 마우스버튼, 함께눌러진키정보등 ItemEvent 객체 : 아이템의체크상태이벤트소스알아내기 object EventObject.getSource() 발생한이벤트의소스컴포넌트를리턴한다. Object 타입으로리턴하므로캐스팅하여사용하는것을추천한다. 모든이벤트객체에서제공됨 이벤트객체의메소드 7 이벤트객체와이벤트소스 8 EventObject 이벤트객체이벤트소스이벤트가발생하는경우 Object getsource() AWTEvent ActionEvent JButton JList JMenuItem 마우스로버튼을클릭하거나키로버튼을선택한경우 리스트아이템을더블클릭하여리스트아이템을선택한경우 메뉴아이템선택을선택한경우 JTextField 텍스트입력중 <Enter> 키를누른경우 JCheckBox 체크박스의선택혹은해제 ActionEvent String getactioncommand() ComponentEvent InputEvent int getmodifiers() ItemEvent Object getitem() int getstatechange() ItemEvent JCheckBoxMenuIte m 체크박스메뉴아이템이선택혹은해제될때 JList 리스트아이템이선택될때 KeyEvent Component 모든컴포넌트에대해, 키가눌러지거나눌러진키가떼어질때 MouseEvent Component 모든컴포넌트에대해, 마우스버튼이눌러지거나떼어질때, 클릭될때, 컴포넌트위에마우스가올라갈때, 올라간마우스가내려올때, 마우스가드래그될때, 마우스가단순움직일때 FocusEvent Component 모든컴포넌트에대해, 컴포넌트가포커스를받거나잃을때 MouseEvent int getbutton() int getclickcount() Point getpoint() int getx() int gety() KeyEvent char getkeychar() int getkeycode() String getkeytext() TextEvent TextField TextArea 텍스트가변경될때 텍스트가변경될때 WindowEvent Window Window를상속받는모든컴포넌트에대해, 윈도우가활성화, 비활성화, 아이콘화, 아이콘에서복구될때, 윈도우가열리거나닫힐때, 윈도우가종료될때등 AdjustmentEvent JScrollBar 스크롤바를사용자가움직였을때 ComponentEvent Component 모든컴포넌트에대해, 컴포넌트가사라지거나, 나타나거나, 이동하거나크기변경될때 ContainerEvent Container Container에컴포넌트가추가혹은삭제되었을때
이벤트리스너 (Event Listener) 이벤트리스너등록 9 이벤트리스너란? 이벤트를처리하는핸들러 이벤트리스너는인터페이스 (interface) 이다. 개발자가리스너인터페이스의모든추상메소드구현필요 이벤트가발생하면이미약속된메소드호출 예 ) ActionListener 인터페이스 interface ActionListener { // 아래메소드를개발자가구현해야함 public void actionperformed(actionevent e); // Action 이벤트발생시호출 예 ) MouseListener 인터페이스 10 이벤트리스너등록 이벤트를받아처리하고자하는컴포넌트에이벤트리스너등록이벤트리스너등록시사용되는메소드 Component.addXXXListener(listener) xxx : 이벤트명 listener : 이벤트리스너객체 예 ) addmouselistener(), addactionlistener(), addfocuslistener() 등 이벤트리스너가등록된컴포넌트에만이벤트처리가능 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); // 마우스가컴포넌트위에서내려오는순간호출 리스너인터페이스와메소드 11 리스너인터페이스 리스너메소드 메소드가호출되는경우 ActionListener actionperformed(actionevent) ActionEvent 가발생하는경우 ItemListener itemstatechanged(itemevent) ItemEvent 가발생하는경우 KeyListener keypressed(keyevent) 키가눌러질때 keyreleased(keyevent) 눌러진키가떼어질때 keytyped(keyevent) 키가입력될때 MouseListener mousepressed(mouseevent) 마우스버튼이눌러질때 mousereleased(mouseevent) 눌러진마우스버튼이떼어질때 mouseclicked(mouseevent) 마우스클릭될때 이벤트리스너작성예 12 public class ListenerSample extends JFrame { ListenerSample () { settitle( Action 이벤트리스너작성 "); setlayout(new FlowLayout()); mouseentered(mouseevent) 마우스가임의의컴포넌트위에올라올때 mouseexited(mouseevent) 컴포넌트에올라온마우스가컴포넌트를벗어날때 MouseMotionListener mousedragged(mouseevent) 마우스를임의의컴포넌트위에서드래깅할때 mousemoved(mouseevent) 마우스를임의의컴포넌트위에서움직일때 FocusListener focusgained(focusevent) 컴포넌트가포커스를받을때 focuslost(focusevent) 컴포넌트가포커스를잃을때 TextListener textvaluechanged(textevent) 텍스트가변경될떄 WindowListener windowopened(windowevent) 윈도우가생성되어처음으로보이게될때 windowclosing(windowevent) 사용자가윈도우의시스템메뉴에서윈도우닫기를시도할때 windowiconfied(windowevent) 윈도우가보통크기에서아이콘화될때 windowdeiconfied(windowevent) 아이콘상태의윈도우가가보통상태로복귀할때 windowclosed(windowevent) 윈도우닫기절차에의해윈도우가닫혀졌을때 windowactivated(windowevent) 윈도우가활성화윈도우로설정되어활성화될때 windowdeactivated(windowevent) 활성화상태의윈도우가비활성화될때 AdjustmentListener adjustmentvaluechanged(adjustmentevent) 스크롤바를움직였을때 ComponentListener componenthidden(componentevent) 컴포넌트가보이지않는상태로될때 componentshown(componentevent) 컴포넌트가보이는상태로될때 componentresized(componentevent) 컴포넌트의크기가변경될때 compnentmoved(componentevent) 컴포넌트의위치가변경될때 ContainerListener componentadded(containerevent) 컴포넌트가컨테이너에추가될때 componentremoved(containerevent) 컴포넌트가컨테이너에서삭제될때 Mouse 이벤트리스너생성 버튼의문자열변경 JButton btn = new JButton( Action"); MyActionListener listener = new MyActionListener (); btn.addactionlistener(listener ); add(btn); setsize(300,150); 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); 이벤트리스너등록 이벤트리스너구현
예제 10-1 : 버튼에 Mouse 이벤트를처리하는예제 13 초기상태 public class ListenerMouseEx extends JFrame { ListenerMouseEx() { settitle(" 버튼에 Mouse 이벤트리스너작성 "); setlayout(new FlowLayout()); JButton btn = new JButton("Mouse Event 테스트버튼 "); btn.setbackground(color.yellow); MyMouseListener listener = new MyMouseListener(); btn.addmouselistener(listener); add(btn); setsize(300,150); Tip : 리스너등록메소드가 addxxxlistener 인이유? 14 한컴포넌트는서로다른이벤트에대한리스너를동시에여러개가질수있다. JButton.addActionListener(); // Action 리스너 JButton.addKeyListener(); // Key 리스너 JButton.addFocusListener(); // Focus 리스너 마우스가버튼에올라갈때 마우스가버튼에서내려올때 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 mousereleased(mouseevent e) { public void mouseclicked(mouseevent e) { 한컴포넌트는한이벤트에대해여러개의리스너를동시에가질수있다. JButton.addActionListener(new MyButtonListener1()); JButton.addActionListener(new MyButtonListener2()); JButton.addActionListener(new MyButtonListener3()); 이때, 리스너는등록된반대순으로모두실행된다. 이벤트리스너작성방법 15 3 가지방법 독립클래스로작성 이벤트리스너를완전한클래스로작성 내부클래스 (inner class) 로작성 익명클래스 (anonymous class) 로작성 독립클래스로리스너작성 16 독립된클래스로 Action 이벤트핸들러작성 이클래스를별도의 MyActionListener.java 파일로저장하여도됨 public class IndepClassListener extends JFrame { IndepClassListener() { settitle("action 이벤트리스너작성 "); setlayout(new FlowLayout()); setsize(300,150); JButton btn = new JButton("Action"); MyActionListener listener = new MyActionListener(); btn.addactionlistener(listener); add(btn); 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");
내부클래스로리스너작성 17 Action 이벤트리스너를내부클래스로작성 private 으로선언하여 InnerClassListener 의외부에서리스너를사용할수없게할수있음 리스너에서 InnerClassListener 의멤버에대한접근이용이함 public class InnerClassListener extends JFrame { InnerClassListener() { settitle("action 이벤트리스너작성 "); setlayout(new FlowLayout()); setsize(300,300); 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() 호출 new InnerClassListener(); 익명클래스로이벤트리스너작성 18 익명클래스란? ( 클래스정의 + 인스턴스생성 ) 을한번에작성 new 익명클래스의수퍼클래스이름 ( 생성자의인자들 ) {... 클래스정의... ; ActionListener 를구현하는익명의이벤트리스너작성예 클래스선언 class MyActionListener implements ActionListener { void actionperformed(actionevent e) {... 메소드구현... new MyActionListener (); 클래스인스턴스생성 new ActionListener() { void actionperformed(actionevent e) {... 메소드구현... ; 익명클래스탄생 ( 클래스선언과인스턴스생성을동시에 ) 익명클래스로이벤트리스너작성 19 익명클래스로다시작성된결과 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()); ); public class AnonymousClassListener extends JFrame { AnonymousClassListener() { settitle("action 이벤트리스너작성 "); setlayout(new FlowLayout()); setsize(300,300); 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()); new AnonymousClassListener (); 예제 10-2 : 마우스로문자열이동시키기 20 마우스버튼을누르면마우스가있는위치로 hello 문자열을이동시킨다. 이벤트와리스너 : MouseEvent와 MouseListener 이벤트소스 : JPanel 구현할리스너의메소드 : mousepressed() 하나 hello 문자열표현 : JLabel 컨텐트팬 : JPanel로교체, 배치관리자 null로설정 * 간단한리스너의경우익명클래스사용추천. 메소드의개수가 1, 2 개인리스너 (ActionListener, ItemListener) 에대해주로사용 초기화면마우스다른곳에클릭한경우마우스다른곳에클릭한경우
예제 10-2 의소스 21 public class MouseListenerEx extends JFrame { JLabel la; MouseListenerEx() { settitle("mouse 이벤트예제 "); setlayout(null); contentpane.addmouselistener(new MyMouseListener()); la = new JLabel("hello"); la.setsize(50, 20); la.setlocation(30, 30); contentpane.add(la); setsize(200,200); 마우스버튼이눌러진위치를알아내어 la 를그위치로옮긴다. class MyMouseListener implements MouseListener { 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) { new MouseListenerEx(); 어댑터 (Adapter) 클래스 22 이벤트리스너구현에따른부담 리스너의추상메소드들을모두구현하여야하는부담 마우스리스너에서마우스가눌러지는경우 (mousepressed()) 만다루고자하는경우에도나머지 4 개의메소드도모두구현하여야함. 어댑터클래스 JDK 에서제공 이벤트리스너를간단히구현해놓은클래스 리스너의모든메소드가단순리턴하도록구현됨 MouseAdapter 예 class MouseAdapter implements MouseListener { public void mousereleased(mouseevent e) { public void mouseclicked(mouseevent e) { public void mouseentered(mouseevent e) { public void mouseexited(mouseevent e) { 메소드를하나만가진리스너는해당어댑터가존재하지않음 ActionAdapter, ItemAdapter 등은존재하지않음 리스너와어댑터클래스 23 어댑터사용예 24 리스너인터페이스 ActionListener ItemListener KeyListener MouseListener MouseMotionListener FocusListener TextListener WindowListener AdjustmentListener ComponentListener ContainerListener 어댑터클래스없음없음 KeyAdapter MouseAdapter MouseMotionAdapter FocusAdapter 없음 WindowAdapter 없음 ComponentAdapter ContainerAdapter JLabel la; contentpane.addmouselistener(new MyMouseListener());.. class MyMouseListener implements MouseListener { 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) { MouseListener를이용한경우 JLabel la; contentpane.addmouselistener(new MyMouseAdapter());.. class MyMouseAdapter extends MouseAdapter { int x = e.getx(); int y = e.gety(); la.setlocation(x, y); MouseAdapter 를이용한경우
예제 10-3: MouseAdapter 사용하기 Key 이벤트와포커스 25 26 public class MouseAdapterEx extends JFrame { JLabel la; MouseAdapterEx() { settitle("mouse 이벤트예제 "); setlayout(null); contentpane.addmouselistener(new MyMouseAdapter()); la = new JLabel("hello"); la.setsize(50, 20); la.setlocation(30, 30); contentpane.add(la); setsize(200,200); class MyMouseAdapter extends MouseApater { int x = e.getx(); int y = e.gety(); la.setlocation(x, y); new MouseAdapterEx(); 키이벤트는키를입력하는다음 3 경우에발생 키를누르는순간 누른키를떼는순간 누른키를떼는순간 + Unicode 키가입력된경우키이벤트를받을수있는조건 키가발생한컴포넌트가포커스를가지고있어야함포커스 키이벤트를독점하는권한 컴포넌트에포커스설정방법 component.requestfocus(); // component가키이벤트를받을수있게함모든컴포넌트에대해사용자는키입력가능 키이벤트는모든컴포넌트에기본적으로발생가능 KeyListener 의메소드와키 유니코드 (Unicode) 27 28 KeyListener 의 3 개의메소드 컴포넌트 키를누르는순간누른키를떼는순간 누른키를떼는순간, Unicode 키가입력된경우에만추가적으로 컴포넌트에키이벤트리스너등록 컴포넌트의키리스너 (KeyListener) void keypressed(keyevent e) { // 처리하는루틴 void keyreleased(keyevent e) { // 처리하는루틴 void keytyped(keyevent e) { // 처리하는루틴 키를누르면 KeyListener 의메소드가실행되는순서 유니코드키의특징 국제산업표준 전세계의문자를컴퓨터에서일관되게표현하기위한코드체계 문자들에대해서만코드값이정의됨 A~Z, a~z, 0~9,!, @, & 등 문자키가아닌경우에는통일된키코드값이없음 <Function> 키, <Home> 키, <Up> 키,<Delete> 키, <Control> 키, <Shift> 키, <Alt> 등 유니코드키가입력되는경우 keypressed(), keyreleased() 만호출됨유니코드키가아닌경우 keypressed(), keytyped(), keyreleased() 가모두호출됨 component.addkeylistener(mykeylistener);
입력된키판별 가상키 (Virtual Key) 29 KeyEvent 객체 입력된키값을가진이벤트객체 KeyEvent의메소드로입력된키판별 Unicode 키의문자값을판별, char KeyEvent.getKeyChar() 눌러진키에해당하는문자값리턴 눌러진키가Unicode 문자키인경우에만의미있음 Unicode 문자외모든키판별, int KeyEvent.getKeyCode() 눌러진키에대한정수형키코드값리턴 Unicode 문자에관계없이, function 키, modifier 키, Control 키, Action 키등모든키에대해키코드값리턴 운영체제나하드웨어에따라키셋은서로다름 입력된키를판별하기위해가상키 (Virtual Key) 값과비교하여야함 가상키값은 KeyEvent 클래스의상수로정의됨키이름문자열리턴 String KeyEvent.getKeyText(int keycode) static keycode에해당하는키의이름을문자열을리턴 F1 키의경우 "F1", Shift 키의경우 "SHIFT" 등의문자열리턴 30 가상키는 KeyEvent 클래스에상수로정의되어있음 가상키의일부분 가상키 설명 가상키 설명 VK_0 ~ VK_9 0에서 9까지의숫자키 VK_LEFT 왼쪽방향키 0 ~ 9 까지의 ASCII 값과동일 VK_A ~ VK_Z A에서 Z까지의문자키, A ~ Z 까지의 VK_RIGHT 오른쪽방향키 ASCII 값과동일 VK_F1 ~ VK_F24 <Function> 키 F1 ~ F24까지의키코드 VK_UP <Up> 키 VK_HOME <Home> 키 VK_DOWN <Down> 키 VK_END <End> 키 VK_CONTROL <Control> 키 VK_PGUP <Page Up> 키 VK_SHIFT <Shift> 키 VK_PGDN <Page Down > 키 VK_ALT <Alt> 키 VK_UNDEFINED 입력된키의코드값이알수없음 VK_TAB <Tab> 키 KeyListener 의메소드와키 31 컴포넌트 컴포넌트 컴포넌트 a 키를누르는순간 F5 키를누르는순간 w 키를떼는순간 void keypressed(keyevent e) { char keychar = e.getkeychar(); void keypressed(keyevent e) { char keychar = e.getkeychar(); void keytyped(keyevent e) { char keychar = e.getkeychar(); keychar keycode keychar keycode keychar keycode 키 a 의유니코드값 ( a ) VK_A CHAR_UNDEFINED VK_F5 키 w 의유니코드값 ( w ) VK_UNDEFINED KeyEvent와 KeyListener의활용 : getkeycode(), getkeychar(), getkeytext() 사용 32 public class KeyListenerEx extends JFrame { JLabel [] keymessage; KeyListenerEx() { settitle("keylistener 예제 "); contentpane.addkeylistener(new MyKeyListener()); keymessage = new JLabel [3]; keymessage[0] = new JLabel(" getkeycode() "); keymessage[1] = new JLabel(" getkeychar() "); keymessage[2] = new JLabel(" getkeytext() "); setsize(300,150); contentpane.requestfocus(); class MyKeyListener extends KeyAdapter { public void keypressed(keyevent e) { char keychar = e.getkeychar(); keymessage[0].settext(integer.tostring(keycode)); keymessage[1].settext(character.tostring(keychar)); keymessage[2].settext(e.getkeytext(keycode)); new KeyListenerEx(); 컴포넌트 F5 키를떼는순간 void keytyped(keyevent e) { char keychar = e.getkeychar(); keychar keycode for(int i=0; i<keymessage.length; i++) { contentpane.add(keymessage[i]); keymessage[i].setopaque(true); keymessage[i].setbackground(color.cyan); JComponent 컴포넌트에바탕색을지정하기위해서는사전에컴포넌트가불투명함을지정하여야한다.
실행결과 33 초기화면 w 키입력 <F1> 키입력 <Control> 키입력 예제 10-4 : F1 키를입력받으면바탕을초록색으로, % 키를입력받으면바탕을노란색으로변경 34 public class KeyCodeEx extends JFrame { JLabel la = new JLabel(); KeyCodeEx() { settitle("key Code 예제 : F1 키 : 초록색, % 키노란색 "); contentpane.addkeylistener(new MyKeyListener()); contentpane.add(la); setsize(300,150); 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); new KeyCodeEx(); % 키를판별하기위해 e.getkeychar() 이용 % 문자와비교 키 9의키코드 키 9의유니크드문자키 9의이름문자열 <Home> 키의코드 <Home> 키에 대응하는문자없음 <Home> 키의이름문자열 JPanel 이키입력을받을수있도록포커스를준다. F1 키를판별하기위해 e.getkeychar() 이용 KeyEvent.VK_F1 값과비교 예제 10-4 실행 예제 10-5 : 상, 하, 좌, 우키로 HELLO 문자열움직이기 35 36 5 키를누른경우로서노란색배경으로변하지않는다. % 키가입력된경우로배경이노란색으로변경되었다. % 는 Shift 키 +5 키이므로최종적으로는 5 키에대한문자열이출력 public class FlyingTextEx extends JFrame { JLabel la = new JLabel("HELLO"); final int FLYING_UNIT = 10; FlyingTextEx() { settitle(" 상, 하, 좌, 우키를이용하여텍스트움직이기 "); setdefaultcloseoperation( JFrame.EXIT_ON_CLOSE); setcontentpane(p); contentpane.setlayout(null); contentpane.addkeylistener(new MyKeyListener()); la.setlocation(50,50); la.setsize(100,20); contentpane.add(la); setsize(300,300); contentpane.requestfocus(); class MyKeyListener extends KeyAdapter { public void keypressed(keyevent e) { 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; new FlyingTextEx();
예제실행 : 상, 하, 좌, 우키로텍스트움직이기 MouseEvent 와 MouseListener,MouseMotionListener 37 38 Mouse 이벤트 (50,50) 사용자의마우스조작에따라발생하는이벤트 Mouse 이벤트가발생하는경우리스너의메소드리스너 마우스가컴포넌트위에올라갈때 void mouseentered(mouseevent e) MouseListener 마우스가컴포넌트에서내려올때 void mouseexited(mouseevent e) MouseListener 마우스버튼이눌러졌을때 void mousepressed(mouseevent e) MouseListener 눌러진버튼이떼어질때 void mousereleased(mouseevent e) MouseListener 상, 하, 좌, 우키를움직이면한번에 10 픽셀씩 HELLO 텍스트는상, 하, 좌, 우로이동한다. 이텍스트는프레임의영역을벗어나서움직일수있다. 마우스가컴포넌트를클릭하였을때 void mouseclicked(mouseevent e) MouseListener 마우스가드래그되는동안 void mousedragged(mouseevent e) MouseMotionListener 마우스가움직이는동안 void mousemoved(mouseevent e) MouseMotionListener 마우스가클릭되어한번드래그될때메소드호출순서 mousepressed(), mousedragged(), mousereleased(), mouseclicked() MouseEvent 로부터얻을수있는정보 MouseListener 와 MouseMotionListener 사용예 39 40 마우스포인터의위치 int getx(), int gety(), Point getpoint() 입력된마우스버튼 short getbutton() 마우스클릭횟수 int getclickcount() 팝업메뉴클릭 int x = e.getx(); int y = e.gety(); if(e.getbutton() == MouseEvent.BUTTON1) System.out.println("Left Button Pressed"); public void mouseclicked(mouseevent e) { if(e.getclickcount() == 2) { // 더블클릭을처리하는루틴 public class MouseListenerAllEx extends JFrame { JLabel la; MouseListenerAllEx() { settitle("mouselistener 와 MouseMOtionListener 예제 "); contentpane.addmouselistener(new MyMouseListener()); contentpane.addmousemotionlistener( new MyMouseListener()); la = new JLabel("No Mouse Event"); contentpane.add(la); setsize(300,200); class MyMouseListener implements MouseListener, MouseMotionListener { 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()+")"); boolean ispopuptrigger() new MouseListenerAllEx();
실행 : MouseListener 와 MouseMotionListener 사용 41 예제 10-6 : 더블클릭시컨텐트의배경색변경 42 더블클릭할때마다패널의배경색을랜덤하게변경한다. public class ClickAndDoubleClickEx extends JFrame { (20,92) 초기화면 mouseentered() 에의해배경색변경. 마우스버튼이눌러진순간 (162,89) (127,72) 눌러진마우스버튼이떼어진순간 (257,109) ClickAndDoubleClickEx() { settitle("click and DoubleClick 예제 "); contentpane.addmouselistener(new MyMouseListener()); setsize(300,200); 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)); 마우스가패널위에이동하는동안 마우스가패널위에드래깅하는동안 마우스가패널바깥으로나가면 mouseexited() 에의해배경색변경 new ClickAndDoubleClickEx();