Presentation is loading. Please wait.

Presentation is loading. Please wait.

제5장 자바 애플릿.

Similar presentations


Presentation on theme: "제5장 자바 애플릿."— Presentation transcript:

1 제5장 자바 애플릿

2 5.1 간단한 자바 애플릿

3 자바 애플릿 자바 애플릿 자바 애플릿에는 다음과 같은 기본적인 함수가 정의 웹브라우저 내에서 수행되는 자바 프로그램
자바 애플릿은 main() 함수가 없다. 애플릿 프로그램을 작성하려면 Applet 클래스로부터 상속 받아야 함 애플릿뷰어(appletviewer) 애플릿 실행 프로그램 애플릿 클래스는 항상 public으로 선언 자바 애플릿에는 다음과 같은 기본적인 함수가 정의 init(), start(), paint(), stop(), destroy(), update() 애플릿을 개발하는 프로그래머는 이 함수들을 재정의해서 사용

4 예제 예제 : Hello.html 예제 : Hello.java
1 <applet code=Hello.class width=200 height=150> 2 </applet> 예제 : Hello.java 1 import java.awt.*; 2 import java.applet.*; 3 public class Hello extends Applet { private String Greeting[] = { "Hello, world" }; 8 public void paint(Graphics g){ g.drawString(Greeting[0], 25, 25); } 12 } % appletviewer Hello.html

5 자바 애플릿 웹페이지 등록하기 HTML에서 applet 태그는 웹에서 애플릿 등록을 위한 태그
실제 애플릿은 .class 파일에 저장되어 있고, applet 태그는 애플릿 클래스 파일을 기술 <applet code = classfile.class codebase = directory archive = archivefile.zip align = aligndirection name = appletname vspace = 20 hspace = 30 width = 200 height = 100 > </applet> applet 태그에서 code, width, height 어트리뷰트는 항상 존재해야

6 어트리뷰트 code - 컴파일된 자바 애플릿 클래스가 저장된 파일 이름
codebase - 자바 클래스 파일들이 존재하는 디렉토리 이름 codebase는 HTML 파일과 자바 클래스 파일이 다른 디렉토리에 저장되어 있는 경우에 사용 archive - 자바의 .class 파일들을 zip이나 jar 파일로 묶어서 파일의 다운로드 시간을 줄이기 위해 사용 align - 애플릿 정렬 위치를 결정하는데 사용 name - 애플릿의 이름을 지정 애플릿 이름은 한 웹 페이지에서 여러 개의 애플릿이 있을 때 애플릿 간에 통신하는데 사용 vspace - 애플릿 주위에서 세로 방향 마진 (단위: 픽셀) hspace - 애플릿 주위에서 가로 방향 마진 (단위: 픽셀) width - 애플릿의 가로 방향 크기 (단위: 픽셀) height - 애플릿의 세로 방향 크기 (단위: 픽셀)

7 HTML에서 애플릿으로 파라메터 전달 애플릿 getParameter() 메소드 HTML에서는 파라메타를 전달하기 위해 주의
<param name="변수이름" value="변수값"> 문장을 기술 주의 자바 프로그램 내에서 사용되는 변수의 이름과 HTML의 <param name=.. >에서 name 부분에 사용된 변수 이름이 동일해야 함

8 예제 : HelloParam.java HelloParam.html 파일 1 import java.awt.*;
2 import java.applet.*; 3 4 public class HelloParam extends Applet { String message = ""; 6 public void init() { message = getParameter("msg"); if(message == null) message = "Hello"; } 12 public void paint(Graphics g) { g.drawString(message, 25, 25); } 16 } HelloParam.html 파일 1 <applet code=HelloParam.class width=300 height=200> 2 <param name="msg" value="안녕하세요"> 3 </applet>

9 애플릿 메소드 init() 함수 start() 함수 웹브라우저가 자바 애플릿이 있는 홈페이지를 처음 방문했을 때
애플릿에서 사용되는 자료들을 초기화하는데 이용 start() 함수 애플릿이 다시 살아날 때 자동적으로 호출된다. 웹브라우저가 아이콘에서 원래 상태로 돌아올 때, 혹은 다른 페이지로 이동했다가 다시 돌아올 때 자동적으로 호출 오디오 파일을 플레이(play)하거나, 애니메이션을 시작시킬 수 있다.

10 애플릿 메소드 stop() 함수 paint(Graphics g) 함수 start() 함수와 짝을 이루어 사용
웹브라우저가 아이콘으로 되거나, 다른 홈페이지로 이동할 때 자동적으로 시작된다. 오디오 파일 연주나 애니메이션을 중지시킬 수 있다. stop() 함수가 호출된다고 해서 애플릿이 죽는 것은 아니다. paint(Graphics g) 함수 애플릿의 그림이 다시 그려져야 된다고 판단될 때 자동적으로 호출 애플릿이 처음 시작될 때, 애플릿의 크기가 변경될 때, 애플릿이 다른 윈도우에 가려졌다가 다시 보여질 때 그래픽스 클래스는 그림을 그리는데 필요한 정보를 가지고 있다

11 애플릿 메소드 update(Graphics g) 함수 repaint() 함수 destory() 함수
그림을 다시 그려야 할 필요가 있는 경우에 호출 repaint() 함수를 호출하면 repaint()는 다시 update()를 호출한다. destory() 함수 웹브라우저가 종료될 때 애플릿의 destroy() 호출 destory() 함수를 재정의해서 종료에 필요한 코드를 넣을 수 있다.

12 애플릿의 함수들이 호출되는 순서

13 Graphics 클래스 그래픽 컨텍스트(폰트, 컬러 등)와 drawXXX() 메소드들로 구성
drawString(String msg, int x, int y) drawLine(int x1, int y1, int x2, int y2)

14 Graphics 클래스 drawRect(int x, int y, int w, int h)
drawOval(int x, int y, int w, int h)

15 Graphics 클래스 drawRoundRect(int x, int y, int w, int h, int rw, int rh)
drawArc(int x, int y, int w, int h, int a, int b)

16 Graphics 클래스 fillXXX() 메소드 도형을 그리고 내부를 색으로 채우는 메소드
fillRect(int x, int y, int w, int h) fillOval(int x, int y, int w, int h) fillRoundRect(int x, int y, int w, int h, int rw, int rh) fillArc(int x, int y, int w, int h, int a, int b)

17 5.2 이미지 그리기

18 이미지 그리기 Graphics 메소드 Applet 메소드 ImageObserver는 이미지를 관리하기 위한 인터페이스
drawImage(Image im, int x, int y, ImageObserver ob) Applet 메소드 getImage(URL url, String file_name) ImageObserver는 이미지를 관리하기 위한 인터페이스 AWT의 컴포넌트는 ImageObserver 인터페이스를 구현하였기 때문에 ImageObserver로 AWT 컴포넌트를 사용 일반적으로 getImage()는 애플릿의 init() 함수에서 수행되고, 이미지를 화면에 출력하는 것은 paint() 함수에서 수행

19 예제 : ImgTest.java 1 import java.awt.*; 2 3 import java.applet.Applet;
4 5 public class ImgTest extends Applet { 6 Image duke; 8 public void init() { duke = getImage(getDocumentBase(),"duke.gif"); } 12 public void paint(Graphics g) { g.drawImage(duke, 25, 25, this); } 16 }

20 5.3 오디오 파일

21 오디오 클립의 재생 확장자가 .au 파일인 오디오 클립을 플레이할 수 있는 방법을 제공
오디오 클립에 관련된 자바 클래스는 java.applet.AudioClip 클래스이다. Applet 메소드 getAudioClip(URL url, String file_name) 오디오 클립 메소드 play() 함수 - AudioClip 클래스를 플레이 loop() 함수 - 반복적으로 플레이 stop() 함수 - 플레이를 중지

22 예제 : AudioTestTwo.java 1 import java.awt.*; 2 import java.applet.*; 3
4 public class AudioTestTwo extends Applet { AudioClip sound; 6 public void init() { sound=getAudioClip(getCodeBase(), "bark.au"); } 10 public void paint(Graphics g) { g.drawString("Audio Test", 25, 25); } public void start() { sound.loop(); } public void stop() { sound.stop(); } 20 }

23 5.4 자바 애니메이션

24 자바 애니메이션 여러 장의 그림을 일정시간 간격으로 화면에 디스플레이시켜서 그림이 움직이는 듯하게 보여주는 방식
시계 프로그램은 매초마다 시간을 그래픽스 클래스의 drawString() 메소드를 이용해서 새로 그려서 작성 예제 : FClock.java …….. 5 public class FClock extends Applet implements Runnable { while(!stop) { day = new Date(); repaint(); try { Thread.sleep(1000); }catch(Exception ex) { System.out.println("Exception:" + ex.toString()); } ……...

25 더블 버퍼링 기법 이미지를 메모리에 먼저 그린 다음 화면에 출력하는 방법 예제 : Clock.java ………...
6 public class Clock extends Applet implements Runnable { …………. img = createImage(w, h); gc = img.getGraphics(); ………….. gc.drawString(day.toString(),5, h -d); repaint(); …………... public void update(Graphics g) { paint(g); } 56 public void paint(Graphics g) { g.drawImage(img, 10, 50, this); }

26 MediaTracker 클래스 모든 이미지가 로드될 때까지 기다리도록 해준다.
그림이나 자바의 클래스는 비동기적으로(asynchronous) 로드되기 때문에 init() 함수에서 여러 장의 그림을 로드해도 다른 함수가 시작되기 전에 모든 그림이 로드되지는 않는다. MediaTracker은 여러장의 그림을 모두 메모리에 저장하기 때문에 애니메이션에서 중요한 사항이 된다. 생성자 MediaTracker(Component comp) 메소드 addImage(Image image, int id) - 이미지를 메모리에 저장 removeImage(Image image) 이미지를 메모리에서 제거

27 5.5 이중 코드

28 2중 코드 애플릿과 어플리케이션으로 사용할 수 있는 코드 애플릿에서 상속받는 클래스를 만들고 main() 함수를 만든다.
애플릿으로 실행될 때는 main() 함수는 수행이 안되고, 어플리케이션으로 수행될 때만 main()이 실행된다. 2중 코드를 이용하면 애플릿을 어플리케이션으로 실행시킬 수 있지만, 모든 메소드들이 잘 수행되는 것은 아니다. getDocumentBase() 메소드는 애플릿에서는 잘 수행되지만 어플리케이션에서는 원하는 형태의 결과를 반환하지 못한다.

29 예제 : HelloTwo.java …………. 4 public class HelloTwo extends Applet {
String msg; Button ok; 7 public void init() { setLayout(new BorderLayout()); msg = "Hello World.."; ok = new Button("OK"); add("South", ok); } 14 public void paint(Graphics g) { g.drawString(msg, 25, 25); } 18 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); …………..

30 결과 % java HelloTwo % appletviewer HelloTwo.html

31 5.6 애플릿 간의 통신

32 AppletContext를 이용하는 방법
웹브라우저를 관리하기 위한 메소드 웹브라우저의 한 페이지에서 실행되는 애플릿을 억세스하기 위한 메소드 한 페이지에서 실행되는 애플릿을 접근할 수 있는 메소드 Applet getApplet(String name) Enumeration getApplets() getApplet() 메소드는 애플릿의 이름을 매개변수로 받아서 애플릿을 리턴 애플릿 이름은 HTML에서 applet 태그에 name 필드를 이용해서 만든다.

33 AppletContext를 이용하는 방법
HTML <applet code=UsingAppletContextReceiver.class name="receiver" width=300 height=100> </applet> Applet UsingAppletContextReceiver r = (UsingAppletContextReceiver) getAppletContext().getApplet("receiver"); getApplets() 메소드의 사용 방법도 getApplet() 메소드와 유사 AppletContext 문제점 웹브라우저에서 애플릿은 비동기적으로 클래스들이 로드되기 때문에 한 클래스에서 다른 클래스가 로드되어 있는지 알기 어렵다. 애플릿이 로드되지 않으면 getApplet() 메소드 이용 불가 한 페이지 내에 있는 애플릿 간의 통신만 가능

34 static 변수/메소드를 이용하는 방법 객체지향 언어에서 static 변수는 클래스의 전역 변수로 사용된다.

35 5.8 색,폰트, 커서

36 색 java.awt.Color 클래스 Color 클래스의 상수로 정의된 색 생성자 많이 사용하는 색은 상수로 정의
많이 사용되지 않는 색은 RGB(Red Green Blue) 값으로 정의 Color 클래스의 상수로 정의된 색 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 생성자 Color(int r, int g, int b) - r, g, b 는 0 ~ 255 사이의 값을 갖는다. Color(float r, float g, float b) - r, g, b 는 0.0 ~ 1.0 사이의 값을 갖는다.

37 폰트 모든 시스템에서 사용될 만한 대표적인 폰트를 자바 독자적인 이름을 붙여서 사용 생성자 자바에서 사용되는 폰트
Font(String fontname, int style, int size) 자바에서 사용되는 폰트

38 폰트의 스타일

39 마우스 커서 마우스 커서는 Component 클래스 setCursor(Cursor cursor) 메소드를 이용해서 변경 가능.
생성자 Cursor(int type) Cursor(String name)

40 자바에서 지원하는 마우스 커서

41 예제 : AppletMenu.java …………. 5 public class AppletMenu extends Applet {
Cursor waitCursor, defaultCursor; …………... defaultCursor = getCursor(); waitCursor = new Cursor(Cursor.WAIT_CURSOR); MenuBar menubar = new MenuBar(); ………. c = this; while (c != null && !(c instanceof Frame)) { c = c.getParent(); } ((Frame)c).setMenuBar(menubar); if(25 <= x && x <= 125 && 25 <= y && y <= 125) { setCursor(waitCursor); return; } setCursor(defaultCursor); ………...

42 5.9 애플릿을 이용한 홈페이지 이동

43 홈페이지 이동 URL 클래스는 웹의 Uniform Resource Locator를 표현
URLConnection 클래스와 함께 HTTP 프로토콜을 통한 웹이나 file:// URL에 존재하는 자원에 접근할 수 있는 방법을 제공 URL의 일반적인 형태 protocol://hostname[:port]/path/filename#section 프로토콜 file : 하드 디스크에 있는 파일 ftp : FTP 서버에 연결 http : 웹서버에 연결 gopher : gopher 서버에 연결 news : usenet 뉴스 그룹에 연결 telnet : 텔넷 서비스를 이용 wais : wais 서버에 연결

44 예제 : URLButton.java ……… 6 public class URLButton extends Applet implements ActionListener { URL url = null; String title = null; 9 public void init() { ………. try { url = new URL(urlString); }catch(MalformedURLException e) { System.out.println("Invalid URL:"+ urlString); } Button site = new Button(title); site.addActionListener(this); site.setActionCommand(title); add(site); } if(cmd.equals(title)) { getAppletContext().showDocument(url); } ……...

45 5.10 Java 2D

46 자바 2D JDK 1.2에 포함된 자바 2D는 AWT에서 보다 나은 그래픽, 텍스트, 이미지 기능을 제공
2D를 다른 JMF(Java Media Framework)와 같이 사용하는 경우에, 애니메이션 및 멀티미디어 프리젠테이션을 만들 수 있다 자바 2D 관련 클래스들은 하나의 패키지에 속해 있지 않고 여러 패키지에 분산되어 있다. java.awt java.awt.geom java.awt.font java.awt.color java.awt.image java.awt.image.renderable java.awt.print

47 자바 2D JDK 1.2 이전 - 간단한 그리기 기능만 가능한 Graphics 클래스만 제공, JDK 1.2 이후 - 복잡한 그래픽스가 가능한 Graphics2D 클래스를 제공 Graphics2D 클래스는 기존의 Graphics 클래스로부터 상속받는다. Graphics2D 렌더링 컨텍스트(rendering context) Graphics2D는 선의 스타일이나 채색 패턴과 같은 속성

48 렌더링 컨텍스트의 종류 스트로크(stroke) 예: 선의 굵기, 선의 종류, 선 끝과 연결 부분의 종류 페인트(paint)
펜의 스타일을 의미하며, 형태의 외각 선에 적용된다. 예: 선의 굵기, 선의 종류, 선 끝과 연결 부분의 종류 페인트(paint) 형태의 내부를 채워주는 스타일을 의미한다 예: 단색으로 칠하기, 그라데이션으로 칠하기, 패턴을 주어 칠하기 컴포지션 스타일(compositioning style) 오버래핑을 이용한 렌더링 방법이다. 트랜스폼(tranform) : 형태를 변경하는 방법이다. 예: 회전, 축소/확대, 기울이기

49 렌더링 컨텍스트의 종류 클립(clip) 폰트 렌더링 힌트 예: antialiasing 사용 여부
형태의 일부만 화면에 보이도록 하는 것이다. 폰트 문자열을 그림 형태로 표현한다. 렌더링 힌트 그림의 화질과 속도 중에서 어느 것을 우선할 것인가를 기술한다. 예: antialiasing 사용 여부 렌더링 컨텍스트에 속성 설정을 위한 setXXX() 메소드 void setStroke(Stroke s) void setPaint(Paint paint) void setComposite(Composite comp) void setTransform(AffineTransform tx) void setClip(Shape clip) void setFont(Font font) void setRenderingHints(Map hints)

50 java.awt.goem 패키지 점, 선, 곡선, 사각 형, 타원 등의 기본적인 도형을 위한 클래스들을 제공
Arc2D Ellipse2D QuadCurve2D Area GeneralPath Rectangle2D CubicCurve2D Line2D RectangularShape Dimension2D Point2D RoundRectangle2D Graphics2D 클래스 이용 Graphics 클래스와는 다르게 그림을 그릴 객체를 미리 만들고, Graphics2D 클래스의 draw나 fill 메소드를 이용해서 그림을 화면에 나타낸다.

51 예제 : ShapeExample.java 1 import java.awt.*; 2 import java.applet.*;
3 import java.awt.geom.*; 4 5 public class ShapeExample extends Applet { Ellipse2D.Double circle; Rectangle2D.Double rect; 8 public void init() { circle = new Ellipse2D.Double(10, 10, 200, 200); rect = new Rectangle2D.Double(10, 10, 200, 200); } 13 public void paint(Graphics g) { Graphics2D g2 = (Graphics2D) g; g2.fill(circle); g2.draw(rect); } 19 }

52 GradientPaint 클래스 그라데이션을 주기위해서 사용하는 객체
GradientPaint 객체를 Graphics2D 클래스에 setPaint() 메소드를 이용해서 값을 설정해야 한다. 생성자 GradientPaint(float x1, float y1, Color color1, float x2, float y2, Color color2, boolean cyclic) x1과 y1은 시작 좌표이고, x2와 y2는 끝 좌표 그라데이션은 시작 좌표에서 color1 색으로부터 끝 좌표에서 color2 색으로 이루어진다. cyclic은 그라데이션이 반복적으로 이루어지는가 여부를 기술

53 예제 : GradientExample.java
1 import java.awt.*; 2 import java.applet.*; 3 import java.awt.geom.*; 4 5 public class GradientExample extends Applet { Ellipse2D.Double circle; ………... public void init() { gradient = new GradientPaint(10, 10, Color.red, 200, 200, Color.yellow, true); circle = new Ellipse2D.Double(10, 10, 200, 200); rect = new Rectangle2D.Double(10, 10, 200, 200); } 15 public void paint(Graphics g) { Graphics2D g2 = (Graphics2D) g; g2.setPaint(gradient); g2.draw(rect); g2.fill(circle); ……….

54 BasicStroke 클래스 선의 굵기나 스타일을 지정하기 위해서는 스트로크(stroke)를 이용
자바 2D에서 스트로크를 설정하기 위해서는 BasicStroke 클래스를 이용 생성자 BasicStroke() BasicStroke(float width) BasicStroke(float width, int cap, int join) BasicStroke(float width, int cap, int join, float miterlimit) BasicStroke(float width, int cap, int join, float miterlimit, float[] dash, float dash_phase)

55 예제 : StrokeTest.java 1 import java.awt.*; 2 import java.applet.*;
3 import java.awt.geom.*; 4 5 public class StrokeTest extends Applet { Rectangle2D.Double rect; Ellipse2D.Double circle; 8 public void init() { rect = new Rectangle2D.Double(20, 20, 220, 220); circle = new Ellipse2D.Double(20, 20, 220, 220); } 13 public void paint(Graphics g) { Graphics2D g2 = (Graphics2D) g; g2.setStroke(new BasicStroke(2)); g2.draw(rect); float[] dashPattern = 30, 10, 10, 10 ; g2.setStroke(new BasicStroke(8, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10, dashPattern, 0)); g2.draw(circle); } 23 }

56 TexturePaint 클래스 텍스쳐 (texture) 배경을 만드는데 사용되는 클래스 생성자
TexturePaint(BufferedImage txtr, Rectangle2D rect2d) 예제 : TextureExample.java 1 import java.awt.*; 2 import java.applet.*; 3 import java.awt.geom.*; 4 import java.awt.image.*; 5 6 public class TextureExample extends Applet { Rectangle2D.Double rect; BufferedImage img; TexturePaint texture; Rectangle imgRect; 11

57 TexturePaint 클래스 12 public void init() {
rect = new Rectangle2D.Double(10, 10, 200, 200); Image im = getImage(getCodeBase(), "bird.gif"); MediaTracker t = new MediaTracker(this); t.addImage(im, 0); try { t.waitForAll(); }catch(Exception e) { System.out.println("MediaTracker error"); } img = new BufferedImage(im.getWidth(this), im.getHeight(this), BufferedImage.TYPE_INT_RGB); Graphics2D d2 = img.createGraphics(); d2.drawImage(im, 0, 0, this); imgRect = new Rectangle(0, 0, im.getWidth(this), im.getHeight(this)); texture = new TexturePaint(img, imgRect); ] } 28 public void paint(Graphics g) { Graphics2D g2 = (Graphics2D) g; g2.setPaint(texture); g2.fill(rect); } 34 }

58 tanslate() / rotate() 메소드
좌표를 이동하거나 그림을 회전시키기 위한 메소드 void translate(double tx, double ty) void rotate(double theta) 예제 : RotateTest.java 1 import java.awt.*; 2 import java.awt.geom.*; 3 import java.applet.*; 4 5 public class RotateTest extends Applet { Rectangle2D.Double rect; 7 public void init() { rect = new Rectangle2D.Double(10, 10, 150, 50); } 11

59 tanslate() / rotate() 메소드
public void paint(Graphics g) { Graphics2D g2 = (Graphics2D) g; g2.draw(rect); g2.translate(80, 30); g2.rotate(Math.PI/8.0); g2.draw(rect); 18 g2.translate(150, 150); for(int i=0; i < 4; i++) { g2.rotate(Math.PI/2.0); g2.drawString("Hello World", 0, 0); } } 설명 15 g2.translate(80, 30); (80, 30) 위치로 이동한다. 16 g2.rotate(Math.PI/8.0); Math.PI/8.0 라디안만큼 회전한다.

60 GeneralPath 클래스 직선이나 곡선으로 연결되는 도형을 그릴 수 있는 방법 제공
예제 : GeneralRect2.java 1 import java.awt.*; 2 import java.awt.geom.*; 3 import java.applet.*; 4 5 public class GeneralRect2 extends Applet { 6 public void paint(Graphics g) { Graphics2D g2 =(Graphics2D) g; g2.setColor(Color.blue); GeneralPath rect = new GeneralPath(GeneralPath.WIND_EVEN_ODD); rect.moveTo(25.0f, 25.0f); rect.lineTo(100.0f, 25.0f); rect.lineTo(25.0f, 80.0f); rect.lineTo(100.0f, 80.0f); rect.closePath(); g2.fill(rect); } 18 }


Download ppt "제5장 자바 애플릿."

Similar presentations


Ads by Google