상세 컨텐츠

본문 제목

[강좌] 애플릿 프로그래밍 2

프로그래밍/JAVA

by 라제폰 2009. 1. 30. 17:55

본문

[강좌] 애플릿 프로그래밍 2

이글은 잠탱이 3인방님들의 글입니다.
저자와의 협의없이 함부로 Reposting될 수 없음을 알려드립니다.

<FONT face=굴림 size=2>2. 사건(Milestone)들을 위한 메쏘드 먼저 저번 강좌에서 예제로 썼던 Simple.java 화일을 기억하시죠. 오늘도 역시 그 소스화일을 가지고 계속 설명드리도록 하겠습니다. Simple 애플렛을 보시면서 이런 의문이 생기신 분들이 있을지 모르겠군요. 뭐냐하면... 어떻게 main(..) 도 없고, 클래스내에 메쏘드 호출도 없는 것 같 은데, 프로그램이 실행이 되나??? 그렇다면, 메쏘드가 쓰여진 순서에 의해 실행이 되는건 아닐까 하고 생각하신 분들도 계실 것 같습니다만, 그건 아 니구요.... ( 순서를 바꿔도 똑같이 동작함. ) 모든 애플렛이 Applet 클래스의 서브클래스이어야 한다고 전에 설명드린 것 기억하시죠. 바로 이것이 정답(?)입니다. 먼 소리냐구요???? 그럼 설명을 드리지요. Applet 클래스에는 여러가지 메쏘드들이 포함되어있는데, 여러분들께서 작 성하신 애플렛에서 발생할 수 있는 주요한 사건(event)에 반응할 수 있도 록 4개의 메쏘드(init(), start(), stop(), destroy() 메쏘드)들이 오버라이드 (override) 됩니다. 이 4개의 메쏘드들은 애플렛에서 직접적으로 호출되어 지는 것이 아니라, 자동적으로 호출되어집니다. 그래서 Simple 애플렛에서 직접적인 호출을 하지 않았는데도 자동적으로 일련의 순서를 갖고 실행이 되어지는 것입니다. 아래는 각 메쏘드들이 하는 일에 대한 간단한 설명입니다. ◎ init() : 애플렛이 로드(또는 리로드)될때마다 애플렛을 초기화합니다. ◎ start() : 애플렛이 로드될때나 사용자(user)가 애플렛을 포함하는 페이 지에 다시 방문할때와 같은 경우에 애플렛의 실행을 start 합 니다. ◎ stop() : 사용자가 애플렛 페이지를 떠나거나 브로우져를 나가는 것과 같은 경우에 애플렛의 실행을 stop합니다. ◎ destroy() : 언로딩(unloading)을 준비하기 위해 final cleanup을 수행합 니다. (참고적으로 Applet 클래스에 있는 이 메쏘드들 내에는 아무것도 없고 그 냥 이름만 선언되어 있습니다. 예 : public void init() {} 이것을 여러분의 애플렛에 오버라이드 하는 것이죠.) 하지만, 모든 애플렛에 위에 있는 4개의 메쏘드들을 모두 오버라이드할 필 요는 없습니다. 어떤애플렛이냐에 따라 쓰는 것도 있고, 안 쓰는 것도 있 죠. 예를 들어, "Wakeup" 애플렛에서는 초기화 후에 아무것도 하지 않기 때문에, start(), stop(), destroy()를 오버라이드하지 않았습니다.(기억을 하 지 못하는 분은 빨리 찾아보시길....) 따라서 "Wakeup" 애플렛은 init() 메 쏘드를 사용해서 단지 스트링을 "한 번"만 화면에 표시합니다. 하지만 단 지 스트링을 화면에 출력하는 애플렛을 만들기 위해 이런 고생을 하는 것 은 아니니깐......대부분의 애플렛들은 여러 가지 동작을 하도록 만들어야 겠 지요. 그럼 어떤 경우에 위에 있는 메쏘드들을 사용해야 하는가???? 초기화 후에 화면상에 출력되어지는 모양에 변화를 주거나 사용자의 행동 에 반응을 하도록 만들고싶다면, 애플렛에 start() 메쏘드를 오버라이드해 야만 합니다. start()는 애플렛의 작업을 수행하거나 작업을 수행하는데 필요한 객체들을 설정하기위한 메쏘드 입니다. start()를 오버라이드하는 대부분의 애플렛들은 stop() 메쏘드 또한 오버라 이드합니다. stop() 메쏘드는 사용자가 애플렛의 페이지을 보고있지 않을 때, 시스템 자원(resource)를 차지할 수 없도록 애플렛의 실행을 중지시키 게 됩니다. 예를들어, 애니메이션을 보여주는 애플렛은 사용자가 그것을 보고있지 않을때는 애니메이션을 보여주는 것을 중지하여야만 하겠죠. 많은 애플렛들에서 destroy()메쏘드는 거의 쓰지 않는 것 같더라구요. 왜냐 하면 stop()메쏘드가 애플렛의 실행을 중지하는데 필요한 일을 하기 때문 이랍니다.(stop()메쏘드는 destroy() 메쏘드보다 먼저 호출되어집니다.) 아래에는 일반적인 애플렛의 형태입니다. public class ...... extends java.applet.Applet ..... { .......... public void init() { ..... } public void start() { ..... } public void stop() { ..... } public void destroy() { ..... } .......... } 이것으로 Simple 애플렛내에 있는 init(), start(), stop(), destroy() 메쏘드 에 대한 설명은 마치겠습니다. 다시한번 강조하자면, 위의 메쏘드들은 여러 분이 호출하는 것이 아닙니다.!!!!! 이제부터는 paint(...)메쏘드에 대해서 설명하도록 하죠. 이것 또한 상속받은 클래스에 있는 메쏘드를 오버라이딩한 것입니다. Simple 애플렛은 paint(...) 메쏘드의 오버라이딩을 통해 "화면출력의 모양" 을 정의합니다. paint(...) 메쏘드는 애플렛이 오버라이드할 수 있는 두가지의 화면출력 메 쏘드들중 하나입니다. ◎ paint(...) : 기본적인 화면출력 메쏘드이고, 대부분의 메쏘드들은 브로우 져 페이지에 애플렛을 표현하기 위해서 이 메쏘드를 사용합 니다. 다른 하나는, ◎ update(...) : 그리기 작업을 갱신내기 개선하기위해 paint(...) 다음에 사 용할 수 있는 메쏘드입니다. paint(...) 와 update(...) 메쏘드는 Applet 클래스로부터 상속을 받습니다. 그 리고 Applet 클래스는 이 메쏘드들을 Component 클래스로부터 상속받습니 다.(중간과정은 생략, Applet 상속계보도 참조) 즉, paint(...), update(...) 는 Component 클래스내에 있습니다. 두 메쏘드는 Graphics 객체를 매개변수로 받아 화면출력을 하게끔 합니다. 그리고 화면출력의 모양은 paint(...) 메쏘드내에 여러분이 쓰시면 되구요. 재미삼아..... paint(...)메소드 안에 아래에 적힌대로 써보세요.( 물론 이 메 쏘드들은 Graphics 클래스에 포함되어 있는 겁니다. ) g.drawLine(40,50,50,100); g.drawRoundRect(100,50,100,100,20,20); 다 쓰셨으면, Simple.java 를 다시 컴파일 시킨후 브로우져로 보시면 처음 과는 다른 화면 출력을 보실 수 있을 겁니다. 직선과 모서리가 둥근 사각 형이 보이시죠. 이렇게 여러분이 의도한 대로 화면 출력을 하게 만드는 기 능을 하는 것이 바로 이 paint(..) 메쏘드의 역할입니다. 그럼 repaint()는 무엇인가??? 이것은 paint(...)를 재 실행하는 메쏘드라고 할 수 있죠. 그리고 7번째 라인의 resize(.....)는 화면 크기를 바꾸는 메쏘 드라고 할 수 있습니다 첫 번째 매개변수는 너비를, 두 번째 매개변수는 높이를 나타냅니다. 이제 마지막으로 addItem(....)는 버퍼에 지정 스트링을 넣기 위한 메쏘드 입니다. 즉 , buffer.append(....)를 통해 버퍼에 넣게 되지요. buffer 는 저번 강좌에서 언급했으니 다들 아실 줄 압니다. 이렇게 addItem(...)에서 버퍼에 넣어진 스트링은 paint(...) 메쏘드내에 있는 drawString(...)의 첫 번째 매개 변수인 buffer.toString()을 통해 넘겨받게 됩니다. 여기서 toString() 은 버퍼에 있는 데이터를 스트링으로 변환하는 역할을 하죠. 이것으로써 간단한 Simple.java 소스의 분석을 바치도록 하겠습니다. 그럼 HTML에 어떻게 애플렛을 포함시키는가??? 이것은 <applet> 태그를 HTML문서에 넣어줌으로 가능하고, 형식은 아래 와 같습니다. <applet code="... .class" width=... height= ... ></applet> 여기서 code parameter는 컴파일된 .class 파일을 어디서 찾아야 하는지를 브로우져에게 알려주는 역할을 합니다. 그리고 applet과 code 사이에 codebase가 들어가는 경우가 있을 수 있는데, 이것은 .class 파일이 있는 디렉토리를 지정하는 데 사용됩니다. 또한 나중에 설명 드리겠지만, HTML 문서에서 매개변수를 애플렛으로 넘 겨줄 수도 있습니다. 이것은 <PARAM NAME="...." VALUE="....."> 를 통 해 이루어 집니다. ----------------------------- 이번에는 HTML 문서에서 매개변수를 넘겨 받는 애플렛을 작성해 보도록 하죠. // Param.java 1: import java.awt.Graphics; 2: 3: public class Param extends java.applet.Applet { 4: String input_from_page; 5: 6: public void init() { 7: input_from_page = getParameter("Pvalue"); 8: } 9: 10: public void paint(Graphics g) { 11: g.drawString(imput_from_page, 50, 25); 12: } 13: } 아래는 매개변수를 포함하는 HTML 문서입니다. // Param.html <html> <head> <script type="text/javascript">if (!window.T) { window.T = {} } window.T.config = {"TOP_SSL_URL":"https://www.tistory.com","PREVIEW":false,"ROLE":"guest","PREV_PAGE":"","NEXT_PAGE":"","BLOG":{"id":295074,"name":"rahxephon","title":"[RahXePhon] 하쿠나 마타타~","isDormancy":false,"nickName":"라제폰","status":"open","profileStatus":"normal"},"NEED_COMMENT_LOGIN":false,"COMMENT_LOGIN_CONFIRM_MESSAGE":"","LOGIN_URL":"https://www.tistory.com/auth/login/?redirectUrl=https://rahxephon.tistory.com/624","DEFAULT_URL":"https://rahxephon.tistory.com","USER":{"name":null,"homepage":null,"id":0,"profileImage":null},"SUBSCRIPTION":{"status":"none","isConnected":false,"isPending":false,"isWait":false,"isProcessing":false,"isNone":true},"IS_LOGIN":false,"HAS_BLOG":false,"IS_SUPPORT":false,"IS_SCRAPABLE":false,"TOP_URL":"http://www.tistory.com","JOIN_URL":"https://www.tistory.com/member/join","PHASE":"prod","ROLE_GROUP":"visitor"}; window.T.entryInfo = {"entryId":624,"isAuthor":false,"categoryId":151121,"categoryLabel":"프로그래밍/JAVA"}; window.appInfo = {"domain":"tistory.com","topUrl":"https://www.tistory.com","loginUrl":"https://www.tistory.com/auth/login","logoutUrl":"https://www.tistory.com/auth/logout"}; window.initData = {}; window.TistoryBlog = { basePath: "", url: "https://rahxephon.tistory.com", tistoryUrl: "https://rahxephon.tistory.com", manageUrl: "https://rahxephon.tistory.com/manage", token: "R0jublPPtWfKsypufSSuXLM/VwvkeKaH6YOSJf6rrR1YwA/N1z6l2BYgGOmiFLnb" }; var servicePath = ""; var blogURL = "";</script> <title> Applet with Parameter </title> <link rel="stylesheet" type="text/css" href="https://tistory1.daumcdn.net/tistory_admin/userblog/userblog-ab110f5d1b79d344e5b758cda483965fd22a0a44/static/style/revenue.css"/> <link rel="canonical" href="https://rahxephon.tistory.com/624"/> <!-- BEGIN STRUCTURED_DATA --> <script type="application/ld+json"> {"@context":"http://schema.org","@type":"BlogPosting","mainEntityOfPage":{"@id":"https://rahxephon.tistory.com/624","name":null},"url":"https://rahxephon.tistory.com/624","headline":"[강좌] 애플릿 프로그래밍 2","description":"[강좌] 애플릿 프로그래밍 2이글은 잠탱이 3인방님들의 글입니다.저자와의 협의없이 함부로 Reposting될 수 없음을 알려드립니다.2. 사건(Milestone)들을 위한 메쏘드 먼저 저번 강좌에서 예제로 썼던 Simple.java 화일을 기억하시죠. 오늘도 역시 그 소스화일을 가지고 계속 설명드리도록 하겠습니다.Simple 애플렛을 보시면서 이런 의문이 생기신 분들이 있을지 모르겠군요. 뭐냐하면... 어떻게 main(..) 도 없고, 클래스내에 메쏘드 호출도 없는 것 같은데, 프로그램이 실행이 되나??? 그렇다면, 메쏘드가 쓰여진 순서에 의해 실행이 되는건 아닐까 하고 생각하신 분들도 계실 것 같습니다만, 그건 아니구요.... ( 순서를 바꿔도 똑같이 동작함. )모든 애플렛이 Applet 클래스의..","author":{"@type":"Person","name":"라제폰","logo":null},"image":{"@type":"ImageObject","url":"https://img1.daumcdn.net/thumb/R800x0/?scode=mtistory2&fname=https%3A%2F%2Ft1.daumcdn.net%2Ftistory_admin%2Fstatic%2Fimages%2FopenGraph%2Fopengraph.png","width":"800px","height":"800px"},"datePublished":"2009-01-30T17:55:44+09:00","dateModified":"2009-01-30T17:55:44+09:00","publisher":{"@type":"Organization","name":"TISTORY","logo":{"@type":"ImageObject","url":"https://t1.daumcdn.net/tistory_admin/static/images/openGraph/opengraph.png","width":"800px","height":"800px"}}} </script> <!-- END STRUCTURED_DATA --> <link rel="stylesheet" type="text/css" href="https://tistory1.daumcdn.net/tistory_admin/userblog/userblog-ab110f5d1b79d344e5b758cda483965fd22a0a44/static/style/dialog.css"/> <link rel="stylesheet" type="text/css" href="//t1.daumcdn.net/tistory_admin/www/style/top/font.css"/> <link rel="stylesheet" type="text/css" href="https://tistory1.daumcdn.net/tistory_admin/userblog/userblog-ab110f5d1b79d344e5b758cda483965fd22a0a44/static/style/postBtn.css"/> <link rel="stylesheet" type="text/css" href="https://tistory1.daumcdn.net/tistory_admin/userblog/userblog-ab110f5d1b79d344e5b758cda483965fd22a0a44/static/style/tistory.css"/> <script type="text/javascript" src="https://tistory1.daumcdn.net/tistory_admin/userblog/userblog-ab110f5d1b79d344e5b758cda483965fd22a0a44/static/script/common.js"></script> </head> <body> This is the applet:<p> <applet code="Param.class" width=200 height=200> <param name="Pvalue" value="Wake Up!!!!!!"> </applet> <div style="margin:0; padding:0; border:none; background:none; float:none; clear:none; z-index:0"></div> <script type="text/javascript" src="https://tistory1.daumcdn.net/tistory_admin/userblog/userblog-ab110f5d1b79d344e5b758cda483965fd22a0a44/static/script/common.js"></script> <script type="text/javascript">window.roosevelt_params_queue = window.roosevelt_params_queue || [{channel_id: 'dk', channel_label: '{tistory}'}]</script> <script type="text/javascript" src="//t1.daumcdn.net/midas/rt/dk_bt/roosevelt_dk_bt.js" async="async"></script> <script>window.tiara = {"svcDomain":"user.tistory.com","section":"글뷰","trackPage":"글뷰_보기","page":"글뷰","key":"295074-624","customProps":{"userId":"0","blogId":"295074","entryId":"624","role":"guest","trackPage":"글뷰_보기","filterTarget":false},"entry":{"entryId":"624","entryTitle":"[강좌] 애플릿 프로그래밍 2","entryType":"POST","categoryName":"프로그래밍/JAVA","categoryId":"151121","serviceCategoryName":null,"serviceCategoryId":null,"author":"297269","authorNickname":"라제폰","blogNmae":"[RahXePhon] 하쿠나 마타타~","image":"","plink":"/624","tags":["java","애플릿"]},"kakaoAppKey":"3e6ddd834b023f24221217e370daed18","appUserId":"null"}</script> <script type="module" src="https://t1.daumcdn.net/tistory_admin/frontend/tiara/v1.0.5/index.js"></script> <script src="https://t1.daumcdn.net/tistory_admin/frontend/tiara/v1.0.5/polyfills-legacy.js" nomodule="true" defer="true"></script> <script src="https://t1.daumcdn.net/tistory_admin/frontend/tiara/v1.0.5/index-legacy.js" nomodule="true" defer="true"></script> </body> </html> 작성하시다보면 새로운 것들이 몇 개 눈에 띠시죠. 그럼 설명을 드리도록 하죠. 먼저 HTML 문서에서 "<param ..." 태그는 매개변수를 "<applet code =.." 에서 지정한 애플렛으로 보낸다는 것을 의미합니다. 그리고 name는 애플 렛에서 넘겨지는 매개변수의 이름을 일컫는 것이고, value는 그것이 갖는 값을 나타냅니다. 즉 Param 애플렛에 Pvalue이라는 이름(다른 이름으로 해도 됨)으로 매개변수를 넘겨주는 데, Pvalue는 "Wake Up!!!!!"를 갖고 있 다는 얘기가 되죠. 이렇게 <param... 을 통해 넘겨진 매개변수는 Param.java의 7번째 라인에 서 볼수 있듯이 getParameter(..) 메쏘드를 통해 프로그램에서 사용하게 됩 니다.( 이 메쏘드는 Applet 클래스에 있습니다. ) value=.... 에 쓰여진 것은 매개변수의 값으로 String 으로 저장됩니다. 바로 이것이 애플렛에 String 객체로 정의된 input_from_page 에 넣어지게 됩니다. 그리고 이것을 화면 에 표시하기 위해 drawString(.....)메쏘드를 썼구요. 그리고 매개변수는 애플렛에서 필요한 만큼 쓸 수 있습니다. 즉, 필요한 매 개변수의 개수만큼 <param name=... value= ....> 태그를 써 주면 됩니다. -------------------------------- 그럼 이번에는 이벤트(Event)에 대해서 알아 보도록 하죠. 아래에 있는 코드는 여러분들이 이벤트가 무엇인가를 아시는데 도움이 될 것입니다. //EventTutor.java 1: import java.awt.*; 2: 3: public class EventTutor extends java.applet.Applet { 4: public void init() { showStatus("init event"); } 5: 6: public void paint(Graphics g) { showStatus("paint event"); } 7: 8: public void start() { showStatus("start event"); } 9: 10: public void stop() { showStatus("stop event"); } 11: 12: public void destroy() { showStatus("destroy event"); } 13: 14: public void update(Graphics g) { showStatus("update event"); } 15: 16: public boolean mouseUp(Event e, int x, int y) { 17: showStatus("mouseUp event"); 18: return true; 19: } 20: 21: public boolean mouseDown(Event e, int x, int y) { 22: showStatus("mouseDown event"); 23: return true; 24: } 25: 26: public boolean mouseDrag(Event e, int x, int y) { 27: showStatus("mouseDrag event"); 28: return true; 29: } 30: 31: public boolean mouseMove(Event e, int x, int y) { 32: showStatus("mouseMove event"); 33: return true; 34: } 35: 36: public boolean mouseEnter(Event e, int x, int y) { 37: showStatus("mouseEnter event"); 38: return true; 39: } 40: 41: public boolean mouseExit(Event e, int x, int y) { 42: showStatus("mouseExit event"); 43: return true; 44: } 45: 46: public void getFocus(Event e, Object what) { 47: showStatus("getFocus event"); 48: return true; 49: } 50: 51: public void gotFocus(Event e, Object what) { 52: showStatus("gotFocus event"); 53: return true; 54: } 55: 56: public void lostFocus(Event e, Object what) { 57: showStatus("lostFocus event"); 58: return true; 59: } 60: 61: public boolean keyDown(Event e, int x) { 62: showStatus("keyDown event"); 63: return true; 64: } 65: } // EventTutor.html 기존의 HTML문서의 <applet... 태그에 있는 code에 EventTutor.class 라 고 적어주세요. 그럼 이 애플렛을 컴파일 하시고, EventTutor.html을 브로우져나 애플렛 뷰어(appletviwer)로 로드시켜 보십시오. EventTutor 애플렛은 이벤트가 발생할때마다 브로우져나 애플렛뷰어의 상 태표시행(윈도우 하단)에 이벤트의 이름을 출력함으로 반응하게 됩니다. 그럼 분석을 하도록 하죠. 보시면 알겠지만 이번 예제는 코드의 길이만 길지 분석하는데는 어렵지 않을 것입니다. 먼저 새롭게 등장한 첫 번째 라인의 import java.awt.*; . 이것은 awt 패키지로부터 하나이상의 클래스를 import 하기위해 쓰여진 것입니다. 즉 c:\java\classes\java\awt 디렉토리에 있는 class 들을 하나 이 상 쓰겠다는 것이지요.(참고적으로 49개의 클래스가 있음). 이렇게 써도 똑똑한(?) 자바 컴파일러는 실제로 사용하는 것만 링크시킨다네요.(저보다 똑똑한 것 같음.흐흐흐). 여러분이 정확히 어떤 클래스를 import 시키야 하 는지 아신다면 하나하나 나열하셔도 되구요. EventTutor 애플렛에서는 awt 패키지에서 Graphics 클래스와 Event 클래스만 쓰이고 있습니다. 따 라서 첫 번째 라인대신 아래와 같이 쓰셔도 무관합니다. import java.awt.Graphics; import java.awt.Event; 다음은 showStatus(...) 메쏘드로 Applet 클래스에 있습니다. 하는 일은 매 개변수를 String 객체로 받아 상태표시행(status bar)에 표시해 줍니다. 위의 예제에는 애플렛이 반응할 수 있는 여러 가지 이벤트에 동작하는 이 벤트 핸들러(event handler)를 나열했습니다. 차례차례 설명하도록 하죠. ( init(), start(), stop(), destroy(), paint(), update() 메쏘드들은 설명을 했 으니 그냥 통과~~~~~~ ) Event 클래스에는 키나 마우스, 윈도우 동작 등에 관련된 이벤트들을 각각 인스턴스 변수로 정의해 놓고 있습니다.(각자 찾아 보시기 바랍니다. 쬐금 많음.) 각각에 해당되는 이벤트가 발생했을 경우 아래의 메쏘드(이벤트 핸들러)들 이 호출이 됩니다. (아래에 있는 메쏘드들은 Component 클래스에서 오버 라이드 된것임) ◎ mouseUp 이 메쏘드는 마우스 버튼이 애플렛 상에서 눌려졌다가놓여졌을 때 호출되 어집니다. 또한 마우스가 놓여질때의 좌표값을 받습니다. 아래에 좌표값을 나타내게끔 코드를 변경했습니다. public boolean mouseUp(Event e, int x, int y) { showStatus("mouseUp event at (" + x +"," + y + ")"); return true; } ◎ mouseDown 이 메쏘드는 마우스 버튼이 애플렛 상에서 눌려졌을 때 호출되어집니다. 이것 또한 좌표값을 받습니다. ◎ mouseDrag 이 메쏘드는 애플렛 상에서 마우스 버튼을 누른채 움직일 때 호출되어집니 다. 물론 좌표값을 받습니다. ◎ mouseMove 이 메쏘드는 말 그대로 애플렛 상에서 마우스를 움직일 때 호출됩니다. mouseDrag와 다른점은 버튼을 누르지 않고 움직이는 것이겠죠. 이것도 좌 표값을 받겠죠. ◎ mouseEnter 이 메쏘드는 마우스 커서가 애플렛의 범위로 들어오는 경우 호출됩니다. 좌표값 OK. ◎ mouseExit mouseEnter와 반대. ◎ keyDown 이 메쏘드는 애플렛이 동작하는 동안 사용자가 키를 눌렸을 경우 발생됩니 다. 그리고 어떤 키가 눌려졌는지 정수값인 키코드를 넘겨주죠. ◎ getFocus(), gotFocus(), lostFocus() 이 메쏘드들의 동작을 알아보려면......먼저 에플렛 뷰어를 실행시켜 보십시 오. 그리고 나서 애플렛뷰어의 메뉴에 있는 clone으로 여러개의 윈도우를 띄우신다음에...아무 윈도우나 선택해보세요. 그럼 선택된 애플렛뷰어는 엑 티브 타이틀바(윈도우 상단, Appletviewer: EventTutor.html이라고 써있는 부분)는 밝은 색깔일겁니다. 물론 선택되지 않은 애플레뷰어는 어두운 색 이고요. 그런다음 마우스로 애플렛뷰어를 이것 저것 찍어보세요. 그럼 바로 직전에 선택되어 있었던 애플렛 뷰어의 상태표시행에 "lostFocus event" 라고 적힐 것입니다. 바로 이러한 동작을 하죠. 포커스(Focus) 란? 여러 개의 윈도우가 화면상에 떠 있을 때, 이벤트가 발생하면, 그 이벤트가 어느 윈도우에 속하는 가를 정해주는 컴포넌트입니 다. X-window의 Mwm이라는 윈도우 관리자는 자동으로 마우스가 윈도우 를 벗어나면 포커스를 해제해주고, 마우스가 새로 옮겨진 윈도우에 포커스 를 넘겨줌으로써 자동으로 제어를 합니다. 언제인가 윈95에서 그런 것을 흉내내는 유틸리티 windows 동호회에 올라온 것을 본 적이 있었는데, 미 쳐 다운 받지는 못했거든요 !! 아무튼 예제에서는 자동으로 윈도우를 벗어 나도 포커스 제어는 하지 못하고, 마우스로 선택된 윈도우만이 포커스를 갖게 됩니다. 이상입니다. 이것으로 이벤트에 대한 설명을 마치도록 하죠. 이러한 이벤트 및 이벤트 관련 메쏘드들을 위의 예제처럼 단지 상태표시행에 출력하자고 만든건 아 닐거구요. 여러 가지 쓸모가 있을거예요. 이러한 이벤트의 이용은 다음 기 회에 예제를 가지고 설명드리도록 하죠. 다음 시간에는 좀더 화려한 애플렛의 세계로 여러분을 초대하겠습니다. 기 대해 주시고, 이만 줄일까 합니다. 본문의 내용은 필자들의 동의 없이 reposting 되거나 수정 혹은 출판될 수 없습니다. 신세대 언어, 자바 전문가를 꿈꾸는 잠탱이 3인방, 신정호, 제갈영, 조국 </FONT>

관련글 더보기