Presentation is loading. Please wait.

Presentation is loading. Please wait.

프로그래밍언어론 JAVA2 애플릿과 Java 2D 2001년 11월 15일 송 영 자.

Similar presentations


Presentation on theme: "프로그래밍언어론 JAVA2 애플릿과 Java 2D 2001년 11월 15일 송 영 자."— Presentation transcript:

1 프로그래밍언어론 JAVA2 애플릿과 Java 2D 2001년 11월 15일 송 영 자

2 차례 애플릿 소개 이미지 그리기 오디오파일 자바 애니매이션 이중코드 자바 애플릿과의 통신 자바와 자바 스크립트 색/폰트/커서
애플릿을 이용한 홈페이지 이동 자바 2D

3 Applet 소개 자바의 실행 Applet특징 Stand-alone:명령어로 실행->application
Embedded in web bowser:해당페이지가 열릴 때 실행 -> applet Applet특징 Main() 함수가 없다. Applet 프로그램을 상속받아 사용 Test는 웹브라우저나 애플릿뷰어(Appletviewer)를 이용 1. 애플릿 소개

4 자바애플릿의 홈페이지 등록 < applet code = classfile.class 자바애플릿클래스가 저장된 파일이름
|codebase = directory| 자바클래스파일이존재하는 위치 |archive = archivefile.zip| 자바의 .class파일을 zip 이나 jar로 묶어서 사용 |align = aligndirection| 애플릿정렬위치 |name = appletmame| 애플릿간의 통신에사용되는 애프릿이름 |vspace = 20| 애플릿주위에서 세로방향마진 |hspace = 30| 애플릿주위에서 가로방향마진 width = 애플릿의 가로방향크기 height = > 애플릿의 세로방향크기 </applet> 1. 애플릿 소개

5 자바애플릿의 실행 Browsr visit html file Hello.java Hello.class First.html
<applet code=Hello.class width=100 Height=100> ……….. </applet> Byte code ……….

6 애플릿의 함수 호출 Init() start() paint() 이벤트함수 stop() destroy() 1. 애플릿 소개

7 애플릿의 기본적인 함수 init() start() stop() destroy()함수
애플릿이 웹브라우저에 로드될때 자동적으로 수행 애플릿에서 사용되는 자료를 초기화 start() 애플릿이 다시 살아날 때,웹브라우저가 다른 페이지에서 애플릿홈으로 다시돌아올때 자동적으로 호출,thread, 애니매이션,오디오파일 시작 stop() 웹브라우저가 아이콘으로 되거나, 다른 홈으로 이동할 때, start()에서 시작한 것을 멈춤 destroy()함수 웹브라우저 종료, destroy() 가 호출되어 애플릿 종료 1. 애플릿 소개

8 애플릿의 기본적인 함수 paint(Graphics g) update() repaint()
애플릿의 그림을 다시 그려야할 때, 처음시작,크기변경,다시보일때 update() 애플릿에 그려진 그림을 모두 지우고 paint() 함수를 호출 repaint() 그림을 다시 그려야 할 필요성이 있는 경우 repaint() 는 다시 update() 호출 1. 애플릿 소개

9 THML에서 애플릿으로 파라미터 연결 HelloParam.java HelloParam.java HelloParam.html
import java.awt.*; import java.applet.*; public class HelloParam extends Applet { String msg = ""; public void init() { msg = getParameter("msg"); if(msg == null) msg = "Hello"; } public void paint(Graphics g) { g.drawString(msg, 25, 25); <html><head><title>파라메터 전달</title></head> <body> <applet code=HelloParam width=200 height=100> <param name="msg" value="안녕하세요"> </applet> </body> </html> HelloParam.java HelloParam.java HelloParam.html 1. 애플릿 소개

10 THML에서 애플릿으로 파라미터 연결 Compile않았을때 결과 1. 애플릿 소개

11 Graphics 함수의 drawXXX와 fillXXX
Paint()함수에서 Graphics 클래스의 drawXXX함수이용 drawString(String msg, int x, int y) drawLine(int x1, int y1, int x2, int y2) drawRect(int x, int y, int w, int h) drawOval(int x, int y, int w, int h) drawRoundRect(int x, int y, int w, int h, int rw, int rh) drawArc(int x, int y, int h, int a, int b) fillRect(int x, int w, int h) fillOval(int x, int y, int h) fillRoundRect(int x, int y, int w, int h, int rw, int rh) fillArc(int x, int y, int h, int a, int b) 2. 이미지 그리기

12 Graphics 함수의 drawXXX와 fillXXX
DrawLine.java import java.awt.*; import java.applet.*; public class DrawLine extends Applet { String msg = ""; public void init() { msg = getParameter("msg"); if(msg == null) msg = "Hello"; } public void paint(Graphics g) { g.drawString(msg, 25, 25); g.drawLine(50, 50, 100, 100); g.drawRect(120,100, 120,100); g.drawOval(150, 250, 100, 100); g.drawRoundRect(400, 50, 200, 100, 10, 10); g.drawArc(250,300,300,400, 90, 90); g.fillRect(120,100,60,100); 2. 이미지 그리기

13 Applet Class 가 제공하는 Method들
Public AppletContext getAppletContext() : 애플릿의 환경인 브라우저에 대한 정보를 준다 Public URL getDocumentBase() :애플릿을 포함하는 HTML 문서의 기반 URL을 되돌린다. Public URL getCodeBase() :애플릿 바이코코드의 기반 URL을 되돌린다. Public URL getParameter(String name) :<PARAM> 태그에서 지정된 변수에 해당하는 값을 되돌린다. Public Image getImage(Url url) :절대경로에 지정된 url에 있는 이미지 인스턴스를 되돌린다. Public Image getImage(Url url, String name) :기반 url과 상대경로로 지정된 url에 있는 이미지 인스턴스를 되돌린다. Public AudioClip getAudioClip(Url url ): 절대경로에 지정된 url에 있는 오디오클립의 인스턴스를 되돌린다. Public AudioClip getAudioClip(Url url, String name) : 기반 url과 상대경로로 지정된 url에 있는 오디오클립의 인스턴스를 되돌린다. Public void play(URL url, String name) : 지정된 url의 오디오 클립 파일을 연주한다. Public void showStatus(String msg) :브라우저의 상태바에 문자열을 디스플레이한다.

14 AppletContext 인터페이스가 제공하는 주요 method
Public Applet getApplet(String name): 브라우저에 있는 애플릿들중 지정된 이름을 가진 애플릿의 인스턴스를 되돌린다. Public Enumeration getApplets() : 브라우저의 현재 윈도우에 있는 애플릿 목록을 되돌린다. Public void showDocument(URL url):브라우저의 현재 윈도우에 지정된 url의 페이지를 디스플레이한다. Public void showDocument(URL url, String target) :브라우저의 target윈도우에 지정된url의 페이지를 디스플레이한다. Public void showStatus(Strig meg): 브라우저의상태바에 문자열을 디스플레이한다. Applet 클레스의 showStatus() 메소드는 결국 이 메소드를 호출한다. 대림출판사. 자바2

15 Image 그리기 ImageTest.java
drawImage(Image im, int x, int y, ImageObserver ob) getImage(URL, url, String file_name) import java.awt.*; import java.applet.Applet; public class ImgTest extends Applet { Image duke; public void init() { duke=getImage(getDocumentBase(),"duke.gif"); } public void paint(Graphics g) { g.drawImage(duke, 25, 25, this); 2. 이미지 그리기

16 오디오 파일 AudioClip 애플릿에서 오디오를 연주할 수 있도록 특별히 고안된 인터페이스.
public void play(); 오디오를 연주한다 public void loop(); 오디오를 연속적으로 연주한다. public void stop(); 오디오실행을 중지시킨다. AudilClip은 현재 오디오가 연주되고 있는지의 여부를 알 수 있는 메소드를 제공하지않음 3. 오디오파일

17 AudioApplet1.java import java.awt.*; import java.awt.event.*;
import java.applet.*; public class AudioApplet1 extends Applet implements ActionListener { Image img1,img2; AudioClip aud3; boolean isPlaying=false; Dimension area; public void init() { img1=getImage( getDocumentBase(), "running.gif"); img2=getImage( getCodeBase(),"stopped.gif"); aud3=getAudioClip(getCodeBase(),"spacemusic.au"); Panel buttonPanel=new Panel(); Button playButton=new Button("Play"); playButton.addActionListener(this); buttonPanel.add(playButton); Button stopButton=new Button("Stop"); 3. 오디오파일

18 stopButton.addActionListener(this); buttonPanel.add(stopButton);
setLayout(new BorderLayout()); add(buttonPanel, "South"); doLayout(); area=getSize(); area.height-=buttonPanel.getSize().height;} public void stop() { aud3.stop();} public void actionPerformed(ActionEvent ae) { String command = ae.getActionCommand(); if (command.equals("Play")) { aud3.loop(); isPlaying=true; repaint(); } else if (command.equals("Stop")) { aud3.stop(); isPlaying=false; } 3. 오디오파일

19 AudioApplet1.html public void paint(Graphics g) { if (isPlaying)
g.drawImage(img1, 0, 0, area.width, area.height, this); else g.drawImage(img2, 0, 0, area.width, area.height, this); } AudioApplet1.html <HTML> <HEAD><TITLE>Audio Applet</TITLE></HEAD> <BODY> <APPLET CODE=AudioApplet1 WIDTH=200 HEIGHT=200> <PARAM NAME="audio" VALUE="spacemusic.au"> </APPLET> <HR> <A HREF="AudioApplet1.java">Source</A> </BODY> </HTML> 3. 오디오파일

20 결과 3. 오디오파일

21 자바 애니매이션 여러장의 그림을 일정한 시간간격으로 화면에 display시켜서 작성
Paint()함수에서 Graphics 클래스의 drawString함수이용 Thread를 사용하여 시간을 그려줌 Fclock.java import java.awt.*; import java.applet.*; import java.util.*; //Date클래스가 있는 패키지, 시스템의 날짜와 시간을 얻음 public class FClock extends Applet implements Runnable { Date day; Thread runner; Font font; boolean stop; 4.자바 애니매이션

22 font = new Font("TimesRoman", Font.BOLD, 24);
public void start() { day = new Date(); font = new Font("TimesRoman", Font.BOLD, 24); runner = new Thread(this); stop = false; runner.start(); } public void stop() { if(runner != null) { stop = true; runner = null; } public void run() { while(!stop) { repaint(); try { Thread.sleep(1000); } catch(Exception ex) { System.out.println("Exception:" + ex.toString());} 4.자바 애니매이션

23 결과 g.setFont(font); g.drawString(day.toString(), 10, 50); }
public void paint(Graphics g) { g.setFont(font); g.drawString(day.toString(), 10, 50); } Thread.sleep(1000) :스레드를 1000ms(1sec) 동안 sleep상태로 들어간다 g.drawString(day.toString(), 10, 50); :현재시간을 애플릿에 그려준다. g.drawString(day.toLocaleString(), 10,50) : 다른모양의 시스템모양 결과 4.자바 애니매이션

24 자바애니매이션2 윗 프로그램의 단점인 깜빡임을 제거
Double buffering 방법의 이용 :이미지를 먼저 메모리에 그린다음에 화면에 출력하는 방법 Update() method를 override 한다. clock.java import java.awt.*; import java.awt.image.*; import java.applet.*; import java.util.*; public class Clock extends Applet implements Runnable { Date day; Thread runner; Image img; Graphics gc; Font font; int w, h, d; boolean stop; 4.자바 애니매이션

25 font = new Font("TimesRoman", Font.BOLD, 24);
public void start() { day = new Date(); font = new Font("TimesRoman", Font.BOLD, 24); FontMetrics metrics = getFontMetrics(font); d = metrics.getDescent(); w = metrics.stringWidth(day.toString())+10; h = metrics.getHeight()+10; img = createImage(w , h); gc = img.getGraphics(); gc.setFont(font); runner = new Thread(this); stop = false; runner.start(); } public void stop() { if(runner != null) { stop = true; runner = null; 4.자바애니매이션

26 gc.setColor(Color.white); gc.fillRect(0, 0, w + 10, h+10);
public void run() { while(!stop) { day = new Date(); gc.setColor(Color.white); gc.fillRect(0, 0, w + 10, h+10); gc.setColor(Color.gray); gc.drawString(day.toString(),5, h -d); repaint(); try { Thread.sleep(1000); } catch(Exception ex) { System.out.println("Exception:" + ex.toString()); } public void update(Graphics g) { paint(g); public void paint(Graphics g) { g.drawImage(img, 10, 50, this); 4.자바애니매이션

27 자바애니매이션3 MediaTracke():모든 이미지가 로드될 때까지 wait해줌
그림이나 자바클레스는 비동기적으로 로드되므로 start()함수 수행전에 init()의 모든 작업이 완료되지는 않음 offScrImage = createImage(maxWidth, maxHeight); //Creates an off-screen drawable image to be used for double buffering. getGraphics()        //   Creates a graphics context for drawing to an off-screen image. e.printStackTrace(); //Prints the stack trace of the thrown target exception. for (int i=0; i < 10; i++) { String imageFile = new String ("T" + String.valueOf(i+1) + ".gif"); images[i] = getImage(getDocumentBase(), imageFile); //gif이미지 10개를 읽어와서 배열에 넣음 tracker.addImage (images[i], i); //imagetracker에 이미지 등록 } 4.자바 애니매이션

28 public class AnimationTest extends Applet implements Runnable {
AnimationTest.java import java.awt.*; import java.applet.*; public class AnimationTest extends Applet implements Runnable { Image images[]; MediaTracker tracker; int index = 0; int maxWidth, maxHeight; Image offScrImage; Graphics offScrGC; boolean loaded = false, stop = false; Thread runner; public void init() { tracker = new MediaTracker(this); maxWidth = 100; maxHeight = 100; images = new Image[10]; try { offScrImage = createImage(maxWidth, maxHeight); offScrGC = offScrImage.getGraphics(); offScrGC.setColor(Color.lightGray); offScrGC.fillRect(0, 0, maxWidth, maxHeight); 4.자바 애니매이션

29 resize(maxWidth, maxHeight); } catch (Exception e) {
e.printStackTrace(); } for (int i=0; i < 10; i++) { String imageFile = new String ("T" + String.valueOf(i+1) + ".gif"); images[i] = getImage(getDocumentBase(), imageFile); tracker.addImage (images[i], i); try { tracker.waitForAll(); //imagetracker는 이미지로드가 끝날때까지 애플릿수행을 멈춘다 } catch (InterruptedException e) { } loaded = true; runner = new Thread(this, "runner"); public void paint(Graphics g) { if (loaded) { g.drawImage(offScrImage, 0, 0, this);//메모리의 이미지를 화면에 그린다 4.자바 애니매이션

30 public void update(Graphics g) { paint(g); } public void start() {
index = 0; if (tracker.checkID (index)) { offScrGC.drawImage (images[index], 0, 0, this); if(runner == null) { runner = new Thread(this, "runner"); runner.start(); public void stop() { if(runner != null) { stop = true; runner = null;} 입력한 10개의 이미지 4.자바 애니매이션

31 Animation 실행결과 public void run () { while(!stop) {
if (tracker.checkID (index)) { offScrGC.fillRect(0,0,100,100); offScrGC.drawImage (images[index], 0, 0, this); index++; if (index >= images.length) { index = 0;} }//if try { runner.sleep(100); repaint(); } catch(Exception e) { System.out.println(e); } }//while }//run }//class Animation 실행결과 4.자바 애니매이션

32 이중 코드 HelloTest.java Applet code와 Application code를 동시에 지원
Applet에 main() 함수포함 Applet실행:main()함수무시 application 실행:init()과 start() 별도의 호출로 사용 public void paint(Graphics g) { g.drawString(msg, 25, 25); } public static void main(String args[]) { Frame f = new Frame("Application"); HelloTwo hello = new HelloTwo(); hello.init(); hello.start(); f.add(hello, "Center"); f.setSize(300, 200); f.setVisible(true); HelloTest.java import java.awt.*; import java.applet.*; public class HelloTwo extends Applet { String msg; Button ok; public void init() { setLayout(new BorderLayout()); msg = "Hello World.."; ok = new Button("OK"); add("South", ok); } 5. 이중 코드

33 Application 결과 Applet결과 5. 이중 코드

34 애플릿간의 통신 자바 애플릿의 재사용성을 높임 애플릿간의 통신 방법 3가지 AppletContext인터페이스를 이용하는 방법
자바애플릿이 실행되는 환경을 표현하는 인터페이스 비동기적 클래스로드로 인해 getApplet()함수에러 한 페이지간의 통신만 가능 Static 함수와 변수를 이용하는 방법 다른페이지의 애플릿과도 통신가능 자바스크립트를 이용하는 방법(생락) 6. 자바애플릿과의 통신

35 AppletContext인터페이스를 이용하는 방법
<applet code=UsingAppletContextReceiver.class name="receiver" width=200 height=100> </applet> Applet getApplet(String name) UsingAppletContextReceiver receiver = UsingAppletContextReceiver) getAppletContext().getApplet("receiver"); getApplet() :애플릿의 이름을 argument로 받아 applet을 리턴 Enumeration getApplets() Enumeration e = getAppletContext().getApplets(); UsingAppletContextReceiver receiver = null; 6. 자바애플릿과의 통신

36 public class UsingAppletContextReceiver
UsingAppletContextReciever.java UsingAppletContextReciever.html import java.applet.*; import java.awt.*; public class UsingAppletContextReceiver extends Applet implements Runnable { String msg = ""; Thread runner; public void init() { runner = new Thread(this); runner.start(); } public void run() { while(true) { try { Thread.sleep(1000); } catch (Exception ex) {} repaint(); } public void setMsg(String msg) { this.msg = msg; public void paint(Graphics g) { g.drawString(msg, 25, 50); <html><head><title>컨텍스트를 이용한 애플릿 통신</title></head> <body bgcolor=white> 안녕하세요. 두개의 애플릿이 통신을 한답니다. <table border=1><tr><td> <applet code=UsingAppletContextReceiver. class name="receiver" width=200 height=100> </applet> <td> <applet code=UsingAppletContextSender. class width=200 height=100> </tr> <tr><td>데이타 리시버 애플릿<td> 데이타 센더 애플릿</tr> </table></body></html> 6. 자바애플릿과의 통신

37 import java.awt.event.*; public class UsingAppletContextSender
UsingAppletContextSender.java import java.applet.*; import java.awt.*; import java.awt.event.*; public class UsingAppletContextSender extends Applet implements ActionListener { TextField input; boolean loaded; UsingAppletContextReceiver receiver = null; public void init() { loaded = false; input = new TextField(15); input.addActionListener(this); add(input); } public void actionPerformed(ActionEvent e) { Component c = (Component) e.getSource(); if(c == input) { if(loaded) { receiver.setMsg(input.getText()); input.setText(""); } else { receiver = (UsingAppletContextReceiver) getAppletContext().getApplet("receiver"); if(receiver != null) { loaded = true; } }//else }//input if }//ActiomEvent }//class 6. 자바애플릿과의 통신

38 6. 자바애플릿과의 통신

39 자바와 자바스크립트 자바스크립트에서 자바애플릿 호출 자바애플릿에서 자바스크립트 호출
자바스크립트는 웹브라우저의 다른 콤포넌트들을 제어하는 것과 같은 방법으로 애플릿제어 <Applet> 태그에 name attribute이용 자바애플릿에서 자바스크립트 호출 Import nescape.javascript.JSObject; 를 애플릿프로그램에 import <APPLET CODE="MatchColor.class" WIDTH=300 HEIGHT=150 MAYSCRIPT> :html의 applet태그 설정 7. 자바와 자바스크립트

40 색/폰트/커서 Java.awt.Color 클래스 폰트 마우스커서 상수정의 : 자주사용되는 색 RGB 값이용
Color.black, Color.green, Color.red, Color.blue, Color.lightGray Color.white, Color.cyan, Color.magenta, Color.yellow Color.darkGray, Color.orange, Color.gray, Color.pink RGB 값이용 Color(int r, int g, int b) :0~255의 rgb값 Color(float r, float g, float b) :0.0 ~1.0 의 rgb 값 폰트 Font(String fontname, int style, int size) 마우스커서 Component class의 setCursor(Cursor cursor) -method 이용 Toolkit class의 createCustomCursor-method 이용(사용자이미지) 8.색/폰트/커서

41 애플릿을 이용한 홈페이지 이동 URL(Uniform Resource Locator)를 표현한다.
http 프로토콜을 통한 웹이나 file://URL에 존재하는 자원에 접근할 수 있는 방법을 제공 URlBarApplet.java import java.awt.event.*; import java.net.*; import java.applet.*; public class URLBarApplet extends Applet implements ActionListener { String target; TextField text; public void init() { target=getParameter("TARGET"); setLayout(new BorderLayout()); Button button=new Button("Go!"); 9.애플릿을 이용한 홈페이지 이동

42 button.addActionListener(this); add(button, "East");
text=new TextField(); add(text, "Center"); text.addActionListener(this); doLayout(); } public void actionPerformed(ActionEvent ae) { String url=text.getText(); try { if (target==null) getAppletContext().showDocument(new URL(url)); else getAppletContext().showDocument(new URL(url), target); showStatus("New URL>> "+url); } catch (MalformedURLException mue) { showStatus(mue.getMessage()); return; 9.애플릿을 이용한 홈페이지 이동

43 <HEAD><TITLE>URL Bar Applet</TITLE></HEAD>
url_bar.html <HTML> <HEAD><TITLE>URL Bar Applet</TITLE></HEAD> <BODY> <APPLET CODE=URLBarApplet WIDTH=300 HEIGHT=20> <PARAM NAME="target" VALUE="contents"> </APPLET> <HR> <A HREF="URLBarApplet.java">Source</A> </BODY> </HTML> Fame.html <HTML> <HEAD> <TITLE>URL Bar Applet</TITLE> </HEAD> <FRAMESET ROWS="50,*"> <FRAME SRC="url_bar.html" NAME="url_bar"> <FRAME SRC="contents.html" AME="contents"> </FRAMESET> </HTML> 9.애플릿을 이용한 홈페이지 이동

44 <META HTTP-EQUIV="Content-Type"
contents.html 결과 <HTML> <HEAD> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=EUC-KR"> <TITLE>URL 내용</TITLE> </HEAD> <BODY> <H1> URL 내용</H1> 애플릿의 URL 바에 이동하고자 하는 URL을 입력한 다음<BR> GO 버튼을 누르면 이동합니다. </BODY> </HTML> 9.애플릿을 이용한 홈페이지 이동

45 자바 2D 자바 2D Graphics2D AWT 에서 보다 나은 사용자 인터페이스와 풍부한 라이브러리 제공
JMF(Java Media Framework)와 함께 애니메이션, 프리젠테이션을 제작, play 할 수 있다. 2D관련 클래스가 포함된 package들 Java.awt, java.awt.geom, java.awt.color, java.awt.image, Java.awt.image.renderable Graphics2D Grapics class로부터 상속 Rendering Conext : 선의 스타일, 채색패턴등의 graphic2D 가 가지는 속성들 10.자바 2D

46 Rendering Conext 종류 setXXX method 이용 Stroke : 팬스타일,형태의 외곽선에 적용
Paint :형태내부를 채워주는 스타일 Composition style : 오버래핑을 위한 랜더링 Tranform :형태변경(회전, 축소/확대, 기울이기) Clip : 형태의 일부만 ㅂ기 Font : 문자열을 그림 형태로 보기 Rendering hint :그림의 화질과 속도중 우선내용을 기술 setXXX method 이용 void setStroke(Stroke s) void setPaint(Paint paint) void setComposition(Composite comp) void setClip(Shape clip) void setFont(Font font) void setRenderingHints(Map hints) 10.자바 2D

47 Java.ast.geom package 가 제공하는 클래스들
Arc2D, Ellipse2D, QuadCurve2D, Area, GenerlPath Ractangle2D,CubicCurve2D, Line2D, RectanglarShape Dimension2D, point2d RondRecangle2D 10.자바 2D

48


Download ppt "프로그래밍언어론 JAVA2 애플릿과 Java 2D 2001년 11월 15일 송 영 자."

Similar presentations


Ads by Google