110
자자 자자자 자자자자자 자자 자자자 자자자자자

자바 애플릿 프로그래밍

  • Upload
    garret

  • View
    105

  • Download
    0

Embed Size (px)

DESCRIPTION

자바 애플릿 프로그래밍. 9.1 간단한 자바 애플릿. 9.1.1 애플릿 소개 자바 애플릿 웹브라우저 내에서 수행되는 자바 프로그램 자바 애플릿은 main() 함수가 없다 . cf) 일반 자바 어플리케이션은 main() 함수부터 수행 애플릿 프로그램을 작성하려면 Applet 클래스로부터 상속받아야 애플릿뷰어 (appletviewer) 애플릿 프로그램을 작성하고 테스트하기 위해서 웹브라우저 대신 애플릿 클래스는 항상 public 으로 선언되어야 - PowerPoint PPT Presentation

Citation preview

Page 1: 자바 애플릿 프로그래밍

자바 애플릿 프로그래밍자바 애플릿 프로그래밍

Page 2: 자바 애플릿 프로그래밍

9.1 9.1 간단한 자바 애플릿간단한 자바 애플릿

9.1.1 애플릿 소개 자바 애플릿

웹브라우저 내에서 수행되는 자바 프로그램자바 애플릿은 main() 함수가 없다 .

cf) 일반 자바 어플리케이션은 main() 함수부터 수행 애플릿 프로그램을 작성하려면 Applet 클래스로부터 상속받아야 애플릿뷰어 (appletviewer)

애플릿 프로그램을 작성하고 테스트하기 위해서 웹브라우저 대신

애플릿 클래스는 항상 public 으로 선언되어야

자바 애플릿에는 다음과 같은 기본적인 함수가 정의 init(), start(), paint(), stop(), destroy(), update()애플릿 프로그램을 개발하는 프로그래머는 이 함수들을 오버라이드해서 사용

Page 3: 자바 애플릿 프로그래밍

Applet Applet 클래스의 계층구조클래스의 계층구조

Java.lang.ObjectJava.lang.Object

Java.awt.ComponentJava.awt.Component

Java.lang.ContainerJava.lang.Container

Java.lang.PanelJava.lang.Panel

Java.lang.AppletJava.lang.Applet

Page 4: 자바 애플릿 프로그래밍

9.1 9.1 간단한 자바 애플릿간단한 자바 애플릿

예제 : Hello.html 1 <applet code=Hello.class width=200 height=150> 2 </applet>

예제 : Hello.java 1 import java.awt.*; 2 import java.applet.*; 3 4 public class Hello extends Applet { 5 private String Greeting[] = { 6 "Hello, world" 7 }; 8 9 public void paint(Graphics g){ 10 g.drawString(Greeting[0], 25, 25); 11 } 12 }

% appletviewer Hello.html

Page 5: 자바 애플릿 프로그래밍

9.1 9.1 간단한 자바 애플릿간단한 자바 애플릿1. 자바 애플릿을 웹 홈페이지에 등록하기

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 어트리뷰트는 항상 존재해야

Page 6: 자바 애플릿 프로그래밍

9.1 9.1 간단한 자바 애플릿간단한 자바 애플릿 어트리뷰트

codecode - 컴파일된 자바 애플릿 클래스가 저장된 파일 이름

codebasecodebase - 자바 클래스 파일들이 존재하는 디렉토리 이름 codebase 는 HTML 파일과 자바 클래스 파일이

다른 디렉토리에 저장되어 있는 경우에 사용

archivearchive - 자바의 .class 파일들을 zip 이나 jar 파일로 묶어서 파일의 다운로드 시간을 줄이기 위해 사용 Netscape 3.0 이상에서 지원

alignalign - 애플릿 정렬 위치를 결정하는데 사용

namename - 애플릿의 이름을 지정 애플릿 이름은 한 웹 페이지에서 여러 개의 애플릿이

있을 때 애플릿 간에 통신하는데 사용

vspacevspace - 애플릿 주위에서 세로 방향 마진 ( 단위 : 픽셀 )

hspace hspace - 애플릿 주위에서 가로 방향 마진 ( 단위 : 픽셀 )

widthwidth - 애플릿의 가로 방향 크기 ( 단위 : 픽셀 )

heightheight - 애플릿의 세로 방향 크기 ( 단위 : 픽셀 )

Page 7: 자바 애플릿 프로그래밍

9.1 9.1 그래픽 좌표계그래픽 좌표계

(0, 0) X 축

Y 축

X 값 증가

Y값증가

Page 8: 자바 애플릿 프로그래밍

9.1 9.1 색에 대한 정의색에 대한 정의

빛의 3 원색 Red, Green, Blue

컴퓨터에서 사용 모니터 속의 전자총과 동일

참고 : RGB 모니터 색의 3 원색

Red, Blue, Yellow

Page 9: 자바 애플릿 프로그래밍

9.1 9.1 간단한 자바 애플릿간단한 자바 애플릿

2. Graphics 클래스의 drawXXX() 메소드들 drawString(String msg, int x, int y)

drawLine(int x1, int y1, int x2, int y2)

Page 10: 자바 애플릿 프로그래밍

Line.javaLine.java

import java.awt.*;import java.applet.*;

public class Line extends java.applet.Applet {public void paint (Graphics g){

g.drawLine(50, 50, 100, 150);}

}

Page 11: 자바 애플릿 프로그래밍

9.1 9.1 간단한 자바 애플릿간단한 자바 애플릿

drawRect(int x, int y, int w, int h)

drawOval(int x, int y, int w, int h)

Page 12: 자바 애플릿 프로그래밍

Rect.javaRect.java

import java.awt.*;import java.applet.*;

public class Rect extends java.applet.Applet {public void paint (Graphics g){

g.drawRect(50, 50, 100, 150);}

}

Page 13: 자바 애플릿 프로그래밍

DrawOval.javaDrawOval.java

import java.awt.*;import java.applet.*;

public class DrawOval extends java.applet.Applet { public void paint (Graphics g){

g.drawOval(50, 50, 100, 150); }}

Page 14: 자바 애플릿 프로그래밍

9.1 9.1 간단한 자바 애플릿간단한 자바 애플릿

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)

Page 15: 자바 애플릿 프로그래밍

RoundRect.javaRoundRect.java

import java.awt.*;import java.applet.*;

public class RoundRect extends java.applet.Applet {public void paint (Graphics g){

g.drawRoundRect(50, 50, 100, 150, 20, 20);}

}

Page 16: 자바 애플릿 프로그래밍

DrawArc.javaDrawArc.java

import java.awt.*;import java.applet.*;

public class DrawArc extends java.applet.Applet { public void paint (Graphics g){

g.drawArc(50, 50, 100, 150, 95, 115); }}

Page 17: 자바 애플릿 프로그래밍

실행 결과실행 결과

Page 18: 자바 애플릿 프로그래밍

9.1 9.1 간단한 자바 애플릿간단한 자바 애플릿

draw3DRect(int x, int y, int width, int height, boolean raised)

fill3DRect(int x, int y, int widthm int height, boolean raised)

Page 19: 자바 애플릿 프로그래밍

Draw3DRect.javaDraw3DRect.java

import java.awt.*;import java.applet.*;

public class Draw3DRect extends java.applet.Applet {public void paint (Graphics g){

g.draw3DRect(50, 50, 100, 150, true); }

}

Page 20: 자바 애플릿 프로그래밍

Fill3DRect.javaFill3DRect.java

import java.awt.*; import java.applet.*;

public class Fill3DRect extends java.applet.Applet {public void paint (Graphics g){

g.setColor(Color.red);g.fill3DRect(50, 50, 100, 150, true);

}}

Page 21: 자바 애플릿 프로그래밍

실행 결과실행 결과

Page 22: 자바 애플릿 프로그래밍

다각형 그리기다각형 그리기

drawPolygon(int xPoints[], int yPoints[], int nPoints) drawPloygon(Polygon p)

Polygon(int xPoints[], int yPoints[], int nPoints)

fillPolygon(int xPoints[], int yPoints[], int nPoints) drawPolyline(int xPoints[], int yPoints[], int nPoints) drawPloyline(Polygon p)

Page 23: 자바 애플릿 프로그래밍

DrawPolygon.javaDrawPolygon.java

import java.awt.*;import java.applet.*;

public class DrawPolygon extends java.applet.Applet {int xPts[ ] = {25, 55, 150, 110, 65};int yPts[ ] = {30, 125, 50, 155, 100};

public void paint (Graphics g){g.drawPolygon(xPts, yPts, xPts.length);

}}

Page 24: 자바 애플릿 프로그래밍

DrawPolyLine.javaDrawPolyLine.java

import java.awt.*;import java.applet.*;

public class DrawPolyLine extends java.applet.Applet { int xPts[ ] = {25, 55, 150, 110, 65}; int yPts[ ] = {30, 125, 50, 155, 100};

public void paint (Graphics g){g.drawPolyline(xPts, yPts, xPts.length);

}}

Page 25: 자바 애플릿 프로그래밍

실행 결과실행 결과

Page 26: 자바 애플릿 프로그래밍

9.1 9.1 간단한 자바 애플릿간단한 자바 애플릿

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)

fillPolygon(int xPoints[], int yPoints[], int nPoints)

Page 27: 자바 애플릿 프로그래밍

FillRect.javaFillRect.java

import java.awt.*;import java.applet.*;

public class FillRect extends java.applet.Applet {public void paint (Graphics g){

g.setColor(Color.blue);g.fillRect(50, 50, 100, 150);

}}

Page 28: 자바 애플릿 프로그래밍

FillOval.javaFillOval.java

import java.awt.*;import java.applet.*;

public class FillOval extends java.applet.Applet { public void paint (Graphics g){

g.fillOval(50, 50, 100, 150); }}

Page 29: 자바 애플릿 프로그래밍

FillRoundRect.javaFillRoundRect.java

import java.awt.*;import java.applet.*;

public class FillRoundRect extends java.applet.Applet {public void paint (Graphics g){

g.setColor(Color.red);g.fillRoundRect(50, 50, 100, 150, 20, 20);

}}

Page 30: 자바 애플릿 프로그래밍

FillArc.javaFillArc.java

import java.awt.*;import java.applet.*;

public class FillArc extends java.applet.Applet { public void paint (Graphics g){

g.fillArc(50, 50, 100, 150, 95, 115); }}

Page 31: 자바 애플릿 프로그래밍

FillPolygon.javaFillPolygon.java

import java.awt.*;import java.applet.*;

public class FillPolygon extends java.applet.Applet {int xPts[] = {25, 55, 150, 110, 65};int yPts[] = {30, 125, 50, 155, 100};

public void paint (Graphics g){g.fillPolygon(xPts, yPts, xPts.length);

}}

Page 32: 자바 애플릿 프로그래밍

FillPolygon2.javaFillPolygon2.java

import java.awt.*;import java.applet.*;

public class FillPolygon2 extends java.applet.Applet {int xPts[ ] = {25, 55, 150, 110, 65};int yPts[ ] = {30, 125, 50, 155, 100};Polygon poly = new Polygon(xPts, yPts, xPts.length);

public void paint (Graphics g){g.fillPolygon(poly);

}}

Page 33: 자바 애플릿 프로그래밍

실행 결과실행 결과

Page 34: 자바 애플릿 프로그래밍

9.1 9.1 간단한 자바 애플릿간단한 자바 애플릿

3. HTML 에서 애플릿으로 파라메터 전달하기 애플릿 getParameter() 메소드

애플릿이 HTML 파일로부터 값을 전달받기 위해서 이용

HTML 에서는 파라메타를 전달하기 위해 <param name=" 변수이름 " value=" 변수값 "> 문장을 기술

자바 프로그램 내에서 사용되는 변수의 이름과 HTML 의 <param name=.. > 에서 name 부분에 사용된 변수

이름이 동일한 것에 주의 !!

Page 35: 자바 애플릿 프로그래밍

9.1 9.1 간단한 자바 애플릿간단한 자바 애플릿예제 : HelloParam.java 1 import java.awt.*; 2 import java.applet.*; 3 4 public class HelloParam extends Applet { 5 String message = ""; 6 7 public void init() { 8 message = getParameter("msg"); 9 if(message == null) 10 message = "Hello"; 11 } 12 13 public void paint(Graphics g) { 14 g.drawString(message, 25, 25); 15 } 16 }

HelloParam.html 파일 1 <applet code=HelloParam.class width=300 height=200> 2 <param name="msg" value=" 안녕하세요 "> 3 </applet>

Page 36: 자바 애플릿 프로그래밍

9.1 9.1 애플릿의 실행 흐름 관련 메소드애플릿의 실행 흐름 관련 메소드

init()

start()

stop()

destory()

paint(Graphics g)

update(Graphics g)

브라우저에 처음 불려졌을 때 , 클래스 변수의 초기화

프로그램의 주요한 흐름 시작

브라우저의 이동시

애플릿의 실행이 완전히 종료

애플릿 상의 노출이 있을 때마다

repaint() 메소드 호출시

Page 37: 자바 애플릿 프로그래밍

9.1 9.1 간단한 자바 애플릿간단한 자바 애플릿

9.1.2 애플릿 메소드 init() 함수

웹브라우저가 자바 애플릿이 있는 홈페이지를 처음 방문했을 때 애플릿에서 사용되는 자료들을 초기화하는데 이용

start() 함수애플릿이 다시 살아날 때 자동적으로 호출된다 .

(ex) 웹브라우저가 아이콘에서 원래 상태로 돌아올 때 ,

혹은 다른 페이지로 이동했다가 다시 돌아올 때 자동적으로 호출

오디오 파일을 플레이 (play) 하거나 , 애니메이션을 시작시킬 수 있다 . stop() 함수

start() 함수와 짝을 이루어 사용웹브라우저가 아이콘으로 되거나 , 다른 홈페이지로 이동할 때

자동적으로 시작된다 . 오디오 파일 연주나 애니메이션을 중지시킬 수 있다 . stop() 함수가 호출된다고 해서 애플릿이 죽는 것은 아니다 .

Page 38: 자바 애플릿 프로그래밍

9.1 9.1 간단한 자바 애플릿간단한 자바 애플릿

paint(Graphics g) 함수애플릿의 그림이 다시 그려져야 된다고 판단될 때 자동적으로 호출

(ex) 애플릿이 처음 시작될 때 , 애플릿의 크기가 변경될 때 ,

애플릿이 다른 윈도우에 가려졌다가 다시 보여질 때 그래픽스 클래스는 그림을 그리는데 필요한 정보를 가지고 있다

update(Graphics g) 함수애플릿에 그려진 그림을 모두 지우고 paint() 함수를 호출그림이 많은 경우에 그림을 지우고 새로 그리면

깜빡임 (flickering) 이 발생해서 보기 안 좋은 경우에 ,update() 함수를 오버라이딩해서

깜빡임을 줄일 수 있다 . repaint() 함수

프로그래머가 그림을 다시 그려야 할 필요성이 있는 경우에 호출 repaint() 함수를 호출하면 repaint() 는 다시 update() 를 호출한다 .

Page 39: 자바 애플릿 프로그래밍

9.1 9.1 간단한 자바 애플릿간단한 자바 애플릿 destory() 함수

웹브라우저가 종료될 때 애플릿의 호출따라서 웹브라우저가 종료되기 전까지는 애플릿이 종료되지 않음

프로그래머는 destory() 함수를 오버라이드 해서 애플릿이 적절하게 종료될 수 있도록 종료에 필요한 코드를 넣을 수 있다 .

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

Page 40: 자바 애플릿 프로그래밍

9.2 9.2 이미지 그리기이미지 그리기

이미지 그리기 Graphics 메소드

drawImage(Image im, int x, int y, ImageObserver ob)

Applet 메소드getImage(URL url, String file_name)

ImageObserver 는 이미지를 관리하기 위한 인터페이스AWT 의 컴포넌트는 ImageObserver 인터페이스를 임플리멘츠하였기 때문에 ImageObserver 로 AWT 컴포넌트를 사용

일반적으로 getImage() 는 애플릿의 init() 함수에서 수행되고 , 이미지를 화면에 출력하는 것은 paint() 함수에서 수행

Page 41: 자바 애플릿 프로그래밍

이미지 그리기이미지 그리기

Image getImage(URL url) Image getImage(URL url, String name) boolean drawImage(Image img, int x, int y, ImageObserver observer) boolean drawImage(Image img, int x, int y, int width, int height, ImageObse

rver observer) boolean drawImage(Image img, int x, int y, Color bgcolor, ImageObserver o

bserver) boolean drawImage(Image img, int x, int y, int width, int height, Color bgcol

or ImageObserver observer)

Page 42: 자바 애플릿 프로그래밍

JDK1.2 demoJDK1.2 demo

<applet code=GraphApplet.class width=300 height=120><applet code=GraphApplet.class width=300 height=120>

Page 43: 자바 애플릿 프로그래밍

import java.awt.Graphics;

public class GraphApplet extends java.applet.Applet { double f(double x) {

return (Math.cos(x/5) + Math.sin(x/7) + 2) * getSize().height / 4; }

public void paint(Graphics g) { for (int x = 0 ; x < getSize().width ; x++) {

g.drawLine(x, (int)f(x), x + 1, (int)f(x + 1)); } } public String getAppletInfo() { return "Draws a sin graph."; }}

Page 44: 자바 애플릿 프로그래밍

9.2 9.2 이미지 그리기이미지 그리기예제 : ImgTest.java

1 import java.awt.*; 2 3 import java.applet.Applet; 4 5 public class ImgTest extends Applet { 6 7 Image duke; 8 9 public void init() { 10 duke = getImage(getDocumentBase(),"duke.gif"); 11 } 12 13 public void paint(Graphics g) { 14 g.drawImage(duke, 25, 25, this); 15 } 16 }

Page 45: 자바 애플릿 프로그래밍

9.3 9.3 오디오 파일오디오 파일

오디오 클립의 재생 자바 언어는 확장자가 .au 파일인 오디오 클립을 플레이할 수 있는

방법을 제공

오디오 클립에 관련된 자바 클래스는 java.applet.AudioClip 클래스이다 .

Applet 메소드getAudioClip(URL url, String file_name)

오디오 클립 메소드play() 함수 - AudioClip 클래스를 플레이 loop() 함수 - 반복적으로 플레이stop() 함수 - 플레이를 중지

Page 46: 자바 애플릿 프로그래밍

9.3 9.3 오디오 파일오디오 파일예제 : AudioTestTwo.java 1 import java.awt.*; 2 import java.applet.*; 3 4 public class AudioTestTwo extends Applet { 5 AudioClip sound; 6 7 public void init() { 8 sound=getAudioClip(getCodeBase(), "bark.au"); 9 } 10 11 public void paint(Graphics g) { 12 g.drawString("Audio Test", 25, 25); 13 } 14 public void start() { 15 sound.loop(); 16 } 17 public void stop() { 18 sound.stop(); 19 } 20 }

Page 47: 자바 애플릿 프로그래밍

- 주의사항

1. 얼마나 많은 양의 정지영상 사용 ?

2. 애니메이션 화면의 크기를 결정

3. 이미지의 해상도와 사용된 색상의 수 결정

4. 사용자에 대한 배려

9.4 9.4 자바 에니메이션자바 에니메이션

Page 48: 자바 애플릿 프로그래밍

9.4 9.4 자바 에니메이션자바 에니메이션 자바 애니메이션

보통 여러 장의 그림은 일정시간 간격을 두고 화면에 디스플레이 (display) 시켜서 그림이 움직이는 듯하게 보여주는 방식

시계 프로그램은 매초마다 시간을 그래픽스 클래스의 drawString() 메소드를 이용해서 새로 그려서 작성

예제 : FClock.java …….. 5 public class FClock extends Applet implements Runnable { …….. 26 while(!stop) { 27 day = new Date(); 28 repaint(); 29 try { 30 Thread.sleep(1000); 31 }catch(Exception ex) { 32 System.out.println("Exception:" + ex.toString()); 33 } ……...

Page 49: 자바 애플릿 프로그래밍

원을 움직이는 예원을 움직이는 예

Page 50: 자바 애플릿 프로그래밍

RollingCircle.javaRollingCircle.java

import java.awt.*;import java.applet.*; public class RollingCircle extends Applet implements Runnable{

int x, y;int width, height;int nSpeed;Color c;Thread tThread;

}

Page 51: 자바 애플릿 프로그래밍

public void init( ){x = 0; y = 50;width = 50; height = 50;nSpeed = 50;c = new Color(0, 0, 255);

}

public void start( ){if(tThread == null){

tThread = new Thread(this);tThread.start( );

}}

Page 52: 자바 애플릿 프로그래밍

public void stop( ){if( tThread != null){

tThread.stop( );tThread = null;

}}

public void paint(Graphics g){g.setColor(c);g.fillOval(x, y, width, height);

}

Page 53: 자바 애플릿 프로그래밍

public void run( ){int step = 2;while(true){

c = Color.blue;repaint( );try {

Thread.sleep(nSpeed);}catch(InterruptedException e){}c = Color.white;repaint( );x += step;if( x >= 200 ){

step = -step;x = 200;

}if( x <= 0 ){

step = -step;x = 0;

}}

}

Page 54: 자바 애플릿 프로그래밍

글자를 움직이는 예글자를 움직이는 예

Page 55: 자바 애플릿 프로그래밍

RollingText.javaRollingText.java

import java.awt.*;import java.applet.*;

public class RollingText extends Applet implements Runnable{int x, y;int nWidth;int nSpeed, step;boolean Flag;String strMessage;Thread tThread;

}

Page 56: 자바 애플릿 프로그래밍

public void init(){x = 200; y = 50;nWidth = 0;step = 0;nSpeed = 500;Flag = true;strMessage = " 가나다라마바사아 abcdefg12345678";

}

public void start( ){if(tThread == null){

tThread = new Thread(this);tThread.start( );

}}

Page 57: 자바 애플릿 프로그래밍

public void stop( ){if( tThread != null){

tThread = null;}

}

public void paint(Graphics g){if(Flag){ nWidth = (g.getFontMetrics( )).stringWidth(strMessage); step = nWidth / (strMessage.length( )); Flag = false;}g.drawString(strMessage, x, y);

}

Page 58: 자바 애플릿 프로그래밍

public void run( ){Thread thisThread = Thread.currentThread( );

while(tThread == thisThread){repaint( );try {

Thread.sleep(nSpeed);}catch(InterruptedException e){}x -= step;

if( x <= -nWidth ){x = getSize( ).width;y += 50;

}

if( y >= getSize( ).height ){y = 50;

}}

}

Page 59: 자바 애플릿 프로그래밍

9.4 9.4 자바 에니메이션자바 에니메이션 더블 버퍼링 기법

이미지를 메모리에 먼저 그린 다음에 화면에 출력하는 방법

예제 : Clock.java

………... 6 public class Clock extends Applet implements Runnable { …………. 23 img = createImage(w, h); 24 gc = img.getGraphics(); ………….. 43 gc.drawString(day.toString(),5, h -d); 44 repaint(); …………... 53 public void update(Graphics g) { 54 paint(g); 55 } 56 57 public void paint(Graphics g) { 58 g.drawImage(img, 10, 50, this); 59 }

Page 60: 자바 애플릿 프로그래밍

9.4 9.4 자바 에니메이션자바 에니메이션

MediaTracker 클래스

모든 이미지가 로드될 때까지 기다리도록 해준다 .

그림이나 자바의 클래스는 비동기적으로 (asynchronous)

로드되기 때문에 init() 함수에서 여러 장의 그림을 로드한다고

해도 다른 함수가 시작되기 전에 모든 그림이 로드되지는

않는다 .

MediaTracker 은 여러장의 그림을 모두 메모리에 저장하기

때문에 애니메이션에서 중요한 사항이 된다 .

Page 61: 자바 애플릿 프로그래밍

MediaTracker 클래스 이미지 로드시의 시간 소요 회피 사용 절차

1. MediaTracker 인스턴스 생성

2. 이미지 등록

3. 이미지가 모두 읽혀졌는가 체크 생성자

public MediaTracker(Component comp)

예 ) MediaTracker tracker

tracker = new MediaTracker(this)

9.4 9.4 자바 에니메이션자바 에니메이션

Page 62: 자바 애플릿 프로그래밍

MethodaddImage - 이미지를 메모리에 저장

public void addimage(Image image, int id) public void addimage(Image image, int id, int w, int h)

removeImage - 이미지를 메모리에서 제거 public synchronized void removeImage(Image image) public synchronized void removeImage(Image image, int id) public synchronized void removeImage(Image image, int id,

int w, int h)checkAll()checkAll(boolean load)

모든 이미지를 메모리로 읽어 정상여부 확인

Page 63: 자바 애플릿 프로그래밍

public boolean checkID(int id)public boolean checkID(int id, boolean load)

public int statusAll(boolean load)

public int statusID(int id, boolean load)

public void waitForAll() throws InterruptedException 이미지가 모두 읽혀질 때까지 대기

public synchronized boolean waitForID(int id, long ms) throws InterruptedException

Page 64: 자바 애플릿 프로그래밍

이미지를 바꾸는 예이미지를 바꾸는 예

Page 65: 자바 애플릿 프로그래밍
Page 66: 자바 애플릿 프로그래밍
Page 67: 자바 애플릿 프로그래밍
Page 68: 자바 애플릿 프로그래밍

이미지 이동의 예이미지 이동의 예

Page 69: 자바 애플릿 프로그래밍
Page 70: 자바 애플릿 프로그래밍
Page 71: 자바 애플릿 프로그래밍
Page 72: 자바 애플릿 프로그래밍
Page 73: 자바 애플릿 프로그래밍
Page 74: 자바 애플릿 프로그래밍

9.5 29.5 2 중 코드중 코드

2 중 코드 애플릿으로도 어플리케이션으로도 사용할 수 있도록 하는 코드

애플릿에서 상속받는 클래스를 만들고 main() 함수를 만든다 .애플릿으로 실행될 때는 main() 함수는 수행이 안되고 , 어플리케이션으로 수행될 때만 main() 이 실행된다 .

2 중 코드를 이용하면 애플릿을 어플리케이션으로 실행시킬 수 있지만 , 모든 메소드들이 잘 수행되는 것은 아니다 .

getDocumentBase() 메소드는 애플릿에서는 잘 수행되지만 어플리케이션에서는 원하는 형태의 결과를 리턴하지 못한다 .

Page 75: 자바 애플릿 프로그래밍

9.5 29.5 2 중 코드중 코드예제 : HelloTwo.java

…………. 4 public class HelloTwo extends Applet { 5 String msg; 6 Button ok; 7 8 public void init() { 9 setLayout(new BorderLayout()); 10 msg = "Hello World.."; 11 ok = new Button("OK"); 12 add("South", ok); 13 } 14 15 public void paint(Graphics g) { 16 g.drawString(msg, 25, 25); 17 } 18 19 public static void main(String args[]) { 20 Frame f = new Frame("Application"); 21 HelloTwo hello = new HelloTwo(); 22 hello.init(); 23 hello.start(); 24 f.add(hello, "Center"); 25 f.setSize(300, 200); …………..

Page 76: 자바 애플릿 프로그래밍

9.5 29.5 2 중 코드중 코드

결과% java HelloTwo % appletviewer HelloTwo.html

Page 77: 자바 애플릿 프로그래밍

9.6 9.6 자바 애플릿간의 통신자바 애플릿간의 통신

9.6.1 AppletContext 인터페이스를 이용하는 방법 AppletContext 클래스는 자바 애플릿이 실행되는 환경을 표현하는

인터페이스 AppletContext 에는 두 가지 그룹의 메소드

웹브라우저를 관리하기 위한 메소드웹브라우저의 한 페이지에서 실행되는 애플릿을 억세스하기 위한 메소드

한 페이지에서 실행되는 애플릿을 접근할 수 있는 메소드

Applet getApplet(String name)

Enumeration getApplets()getApplet() 메소드는 애플릿의 이름을 아규먼트로 받아서 애플릿을 리턴

애플릿의 이름은 HTML 에서 applet 태그에 name 필드를 이용해서 만들 수 있다 .

Page 78: 자바 애플릿 프로그래밍

9.6 9.6 자바 애플릿간의 통신자바 애플릿간의 통신

HTML

<applet code=UsingAppletContextReceiver.class name="receiver"

width=300 height=100>

</applet> Applet

UsingAppletContextReceiver r = (UsingAppletContextReceiver)

getAppletContext().getApplet("receiver");

getApplets() 메소드의 사용 방법도 getApplet() 메소드와 유사 AppletContext 문제점

웹브라우저에서 애플릿은 비동기적으로 클래스들이 로드되기 때문에 한 클래스에서 다른 클래스가 로드되어 있는지

알기 어렵다 .애플릿이 로드되지 않으면 getApplet() 메소드를 이용해서 애플릿을

접근할 수 없는 것이다 .AppletContext() 를 사용하는 경우에는 한 페이지에 있는 애플릿간의

통신만 가능하다 .

Page 79: 자바 애플릿 프로그래밍

9.6 9.6 자바 애플릿간의 통신자바 애플릿간의 통신

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

따라서 클래스의 인스턴스 간에 의사 소통을 위해서 static 변수가 많이 사용

자바에서는 클래스 이름만으로 이러한 static 변수와 메소드를 접근할 수 있는 기능을 제공

static 변수 / 메소드를 이용한다면 웹브라우저에서 애플릿간의 통신이 가능

Page 80: 자바 애플릿 프로그래밍

9.7 9.7 자바와 자바스크립트자바와 자바스크립트

9.7.1 자바스크립트에서 자바 애플릿 호출 자바와 자바스크립트는 웹브라우저에서 서로 함수 호출 등의 방법을

통해 의사소통 자바스크립트는 웹브라우저의 다른 컴포넌트를 제어하는 것과

같은 방법으로 애플릿을 제어 <applet> 태그에 name 어트리뷰트를 이용해서 애플릿의 함수를

호출할 수 있다

Page 81: 자바 애플릿 프로그래밍

9.7 9.7 자바와 자바스크립트자바와 자바스크립트 예제 : JSApplet.html

1 <head> 2 <script> 3 function change(form) 4 document.js.setBG(form.bg.value); 5 document.js.setFG(form.fg.value); 6 document.js.setMessage(form.msg.value); 7 document.jsform.msg.value = document.js.getMessage(); 8 form.fg.value = document.js.getFG(); 9 form.bg.value = document.js.getBG(); 10 11 </script> 12 </head> 13 14 <body bgcolor=lightgreen> 15 <applet name="js" code=JSApplet.class width=200 height=150> 16 </applet> ………. 23 <input type=button value=" 적 용 " onClick="change(this.form);"> 24 <input type=reset value=" 초기값 *"> 25 </center> 26 </form> 27 </body>

Page 82: 자바 애플릿 프로그래밍

9.7 9.7 자바와 자바스크립트자바와 자바스크립트 9.7.2 자바 애플릿에서 자바스크립트 호출

자바 애플릿에서 자바스크립트의 함수를 호출하는 경우는 약간 복잡 네스케이프 3.0 버전에서는 자바 애플릿에서 자바스크립트 URL 을 지

원 , 버전이 올라가면서 자바스크립트 URL 대신에 JSObject 클래스를 이용하는 방법으로 변경

JSObject 를 사용하는 경우 JSObject 는 네스케이프 3.0 이상과 MS 익스플로러 4.0 이상에서 지원

JSObject 를 사용하기 위한 단계

1. JSObject 를 설치하고 , CLASSPATH 를 설정한다 .

JSObject 는 java40.jar 에 들어있다 . java40.jar파일을 적당한 디렉토리에 풀고 , CLASSPATH 를 설정한다 .

% jar xvf java40.jar

Page 83: 자바 애플릿 프로그래밍

9.7 9.7 자바와 자바스크립트자바와 자바스크립트2. 애플릿 프로그램에 JSObject 를 import 한다 .

import netscape.javascript.JSObject;

3. 자바 애플릿에서 현재 창에 대한 자바스크립트 레퍼런스를 얻는다 .

JSObject window = JSObject.getWindow(this);

4. JSObject 의 getMember() 메소드를 이용해서 원하는 자바스크립트 프로퍼티를 읽어올 수 있다 .

JSObject document = (JSObject)window.getMember("document"); String cookies = (String)document.cookie; JSObject form = (JSObject) document.getMember("form_name"); JSObject element = (JSObject) document.getMember("element_name");

5. JSObject 의 setMember() 메소드를 이용해서 원하는 자바스크립트 프로퍼티의 값을 설정할 수 있다 .

document.setMember("bgColor", "red");

Page 84: 자바 애플릿 프로그래밍

9.7 9.7 자바와 자바스크립트자바와 자바스크립트6. JSObject 의 call() 메소드를 이용해서 자바스크립트의 함수를 호출

String message = "alert message !!";window.call("alert", message);

window.eval("alert('alert message !!')");

7. HTML 의 applet 태그에 MAYSCRIPT 를 설정해주어야 한다 .

<applet code=.. width=.. height=.. MAYSCRIPT></applet>

Page 85: 자바 애플릿 프로그래밍

9.8 9.8 색색 // 폰트폰트 // 커서커서

9.8.1 색 java.awt.Color 클래스는 많이 사용하는 색은 상수로 만들어 놓고 ,

많이 사용되지 않는 색은 RGB(Red Green Blue) 값을 이용해서 만들어 사용

Color 클래스의 상수로 정의된 색Color.black Color.green Color.redColor.blue Color.lightGray Color.whiteColor.cyan Color.magenta Color.yellowColor.darkGray Color.orangeColor.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 사이의 값을 갖는다 .

Page 86: 자바 애플릿 프로그래밍

9.8 9.8 색색 // 폰트폰트 // 커서커서9.8.2 폰트

모든 시스템에서 사용될 만한 대표적인 폰트를 자바 독자적인 이름을 붙여서 사용

자바에서 사용되는 폰트

Page 87: 자바 애플릿 프로그래밍

Font 클래스

Font(String name, int style, int size)Font.BOLDFont.ITALIC

setFont(Font font)

9.8 9.8 색색 // 폰트폰트 // 커서커서

Page 88: 자바 애플릿 프로그래밍

DrawText.java(DrawText.java(上上 ))

import java.awt.*; import java.applet.*;

public class DrawText extends Applet { public void paint (Graphics g){ // 사용할 Font 의 특성을 지정 Font f = new Font("Helvetica", Font.BOLD + Font.ITALIC, 22); FontMetrics fm = g.getFontMetrics(f);

Page 89: 자바 애플릿 프로그래밍

DrawText.java(DrawText.java(下下 ))

// 화면에 표시할 문자열의 생성 String str = new String("abcdefghijklmnopqrstuvwxyz.1234567890");

// 화면에 표시할 문자 선택 g.setFont(f);

// 실제로 화면에 문자열을 표시하는 메소드 g.drawString(str, (getSize( ).width - fm.stringWidth(str))/2, ((getSize( ).height - fm.getHeight())/2) + fm.getAscent( )); }}

Page 90: 자바 애플릿 프로그래밍

실행 결과실행 결과

<APPLET code=DrawText.class width=600, height=300><APPLET code=DrawText.class width=600, height=300>

Page 91: 자바 애플릿 프로그래밍

9.8 9.8 색색 // 폰트폰트 // 커서커서

폰트의 스타일

Page 92: 자바 애플릿 프로그래밍

9.8 9.8 색색 // 폰트폰트 // 커서커서

9.8.3 마우스 커서 마우스 커서는 Component 클래스의 setCursor(Cursor cursor) 메소드를

이용해서 변경할 수 있다 . 커서를 위해서는 Cursor 클래스가 제공 생성자

Cursor(int type)

Cursor(String name)

Page 93: 자바 애플릿 프로그래밍

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

9.8 9.8 색색 // 폰트폰트 // 커서커서

Page 94: 자바 애플릿 프로그래밍

예제 : AppletMenu.java …………. 5 public class AppletMenu extends Applet { ……. 9 Cursor waitCursor, defaultCursor; …………... 13 defaultCursor = getCursor(); 14 waitCursor = new Cursor(Cursor.WAIT_CURSOR); 15 MenuBar menubar = new MenuBar(); ………. 32 c = this; 33 while (c != null && !(c instanceof Frame)) { 34 c = c.getParent(); 35 } 36 ((Frame)c).setMenuBar(menubar); ………. 63 if(25 <= x && x <= 125 && 25 <= y && y <= 125) { 64 setCursor(waitCursor); 65 return; 66 } 67 setCursor(defaultCursor); ………...

9.8 9.8 색색 // 폰트폰트 // 커서커서

Page 95: 자바 애플릿 프로그래밍

9.9 9.9 애플릿을 이용한 홈페이지 이동애플릿을 이용한 홈페이지 이동

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 서버에 연결

Page 96: 자바 애플릿 프로그래밍

예제 : URLButton.java

……… 6 public class URLButton extends Applet implements ActionListener { 7 URL url = null; 8 String title = null; 9 10 public void init() { ………. 19 try { 20 url = new URL(urlString); 21 }catch(MalformedURLException e) { 22 System.out.println("Invalid URL:"+ urlString); 23 } 24 Button site = new Button(title); 29 site.addActionListener(this); 26 site.setActionCommand(title); 27 add(site); 28 } ………. 32 if(cmd.equals(title)) { 33 getAppletContext().showDocument(url); 34 }

……...

9.9 9.9 애플릿을 이용한 홈페이지 이동애플릿을 이용한 홈페이지 이동

Page 97: 자바 애플릿 프로그래밍

9.10 9.10 자바 자바 2D2D

JDK 1.2 에 포함된 자바 2D 는 AWT 에서 보다 나은 그래픽 , 텍스트 , 이미지 기능을 제공

프로그래머는 자바 2D 를 이용해서 보다 나은 사용자 인터페이스를 개발 , 2D 에서 제공되는 풍부한 라이브러리를 이용하는 경우에 보다 진보된 CAD/CAM 등의 응용 프로그램도 작성

2D 를 다른 JMF(Java Media Framework) 와 같이 사용하는 경우에 , 애니메이션 및 멀티미디어 프리젠테이션을 만들고 디스플레이시킬 수 있다

자바 2D 관련 클래스들은 하나의 패키지에 속한 것이 아니고 여러 패키지에 분포되어 있다 .

java.awtjava.awt.geomjava.awt.fontjava.awt.colorjava.awt.imagejava.awt.image.renderablejava.awt.print

Page 98: 자바 애플릿 프로그래밍

9.10 9.10 자바 자바 2D2D

JDK 1.2 이전 - 간단한 그리기 기능만 가능한 Graphics 클래스만 제공 , JDK 1.2 이후 - 복잡한 그래픽스가 가능한 Graphics2D 클래스를 제공

Graphics2D 클래스는 기존의 Graphics 클래스로부터 상속받는다 . Graphics2D 렌더링 컨텍스트 (rendering context)

Graphics2D 는 선의 스타일이나 채색 패턴과 같은 속성 렌더링 컨텍스트의 종류

스트로크 (stroke) 펜의 스타일을 의미하며 , 형태의 외각 선에 적용된다 .

예 : 선의 굵기 , 선의 종류 , 선 끝과 연결 부분의 종류 페인트 (paint)

형태의 내부를 채워주는 스타일을 의미한다 예 : 단색으로 칠하기 , 그라데이션으로 칠하기 , 패턴을 주어 칠하기

컴포지션 스타일 (compositioning style) 오버래핑을 이용한 렌더링 방법이다 .

트랜스폼 (tranform) : 형태를 변경하는 방법이다 . 예 : 회전 , 축소 / 확대 , 기울이기

Page 99: 자바 애플릿 프로그래밍

9.10 9.10 자바 자바 2D2D 클립 (clip)

형태의 일부만 화면에 보이도록 하는 것이다 . 폰트

문자열을 그림 형태로 표현한다 .렌더링 힌트

그림의 화질과 속도 중에서 어느 것을 우선할 것인가를 기술한다 .

예 : 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)

Page 100: 자바 애플릿 프로그래밍

9.10 9.10 자바 자바 2D2D

java.awt.goem 패키지 점 , 선 , 곡선 , 사각 형 , 타원 등의 기본적인 도형을 위한 클래스들을

제공

Arc2D Ellipse2D QuadCurve2D

Area GeneralPath Rectangle2D

CubicCurve2D Line2D RectangularShape

Dimension2D Point2D RoundRectangle2D

Graphics2D 클래스를 이용해서 그림을 그리는 경우에는 Graphics 클래스와는 다르게 그림을 그릴 객체를 미리 만들고 , Graphics2D 클래스의 draw 나 fill 메소드를 이용해서 그림을 화면에 나타낸다 .

Page 101: 자바 애플릿 프로그래밍

9.10 9.10 자바 자바 2D2D

예제 : ShapeExample.java

1 import java.awt.*; 2 import java.applet.*; 3 import java.awt.geom.*; 4 5 public class ShapeExample extends Applet { 6 Ellipse2D.Double circle; 7 Rectangle2D.Double rect; 8 9 public void init() { 10 circle = new Ellipse2D.Double(10, 10, 200, 200); 11 rect = new Rectangle2D.Double(10, 10, 200, 200); 12 } 13 14 public void paint(Graphics g) { 15 Graphics2D g2 = (Graphics2D) g; 16 g2.fill(circle); 17 g2.draw(rect); 18 } 19 }

Page 102: 자바 애플릿 프로그래밍

9.10 9.10 자바 자바 2D2D

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 은 그라데이션이 반복적으로 이루어지는가 여부를 기술

Page 103: 자바 애플릿 프로그래밍

9.10 9.10 자바 자바 2D2D

예제 : GradientExample.java

1 import java.awt.*; 2 import java.applet.*; 3 import java.awt.geom.*; 4 5 public class GradientExample extends Applet { 6 Ellipse2D.Double circle; ………... 10 public void init() { 11 gradient = new GradientPaint(10, 10, Color.red, 200, 200, Color.yellow, true); 12 circle = new Ellipse2D.Double(10, 10, 200, 200); 13 rect = new Rectangle2D.Double(10, 10, 200, 200); 14 } 15 16 public void paint(Graphics g) { 17 Graphics2D g2 = (Graphics2D) g; 18 g2.setPaint(gradient); 19 g2.draw(rect); 20 g2.fill(circle); ……….

Page 104: 자바 애플릿 프로그래밍

9.10 9.10 자바 자바 2D2D

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)

Page 105: 자바 애플릿 프로그래밍

9.10 9.10 자바 자바 2D2D

예제 : StrokeTest.java

1 import java.awt.*; 2 import java.applet.*; 3 import java.awt.geom.*; 4 5 public class StrokeTest extends Applet { 6 Rectangle2D.Double rect; 7 Ellipse2D.Double circle; 8 9 public void init() { 10 rect = new Rectangle2D.Double(20, 20, 220, 220); 11 circle = new Ellipse2D.Double(20, 20, 220, 220); 12 } 13 14 public void paint(Graphics g) { 15 Graphics2D g2 = (Graphics2D) g; 16 g2.setStroke(new BasicStroke(2)); 17 g2.draw(rect); 18 float[] dashPattern = 30, 10, 10, 10 ; 19 g2.setStroke(new BasicStroke(8, BasicStroke.CAP_BUTT, 20 BasicStroke.JOIN_MITER, 10, dashPattern, 0)); 21 g2.draw(circle); 22 } 23 }

Page 106: 자바 애플릿 프로그래밍

9.10 9.10 자바 자바 2D2D

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 { 7 Rectangle2D.Double rect; 8 BufferedImage img; 9 TexturePaint texture; 10 Rectangle imgRect; 11

Page 107: 자바 애플릿 프로그래밍

9.10 9.10 자바 자바 2D2D

12 public void init() { 13 rect = new Rectangle2D.Double(10, 10, 200, 200); 14 Image im = getImage(getCodeBase(), "bird.gif"); 15 MediaTracker t = new MediaTracker(this); 16 t.addImage(im, 0); 17 try { 18 t.waitForAll(); 19 }catch(Exception e) { 20 System.out.println("MediaTracker error"); 21 } 22 img = new BufferedImage(im.getWidth(this), im.getHeight(this), BufferedImage.TYPE_INT_RGB); 23 Graphics2D d2 = img.createGraphics(); 24 d2.drawImage(im, 0, 0, this); 25 imgRect = new Rectangle(0, 0, im.getWidth(this), im.getHeight(this)); 26 texture = new TexturePaint(img, imgRect); ] 27 } 28 29 public void paint(Graphics g) { 30 Graphics2D g2 = (Graphics2D) g; 31 g2.setPaint(texture); 32 g2.fill(rect); 33 } 34 }

Page 108: 자바 애플릿 프로그래밍

9.10 9.10 자바 자바 2D2D

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 { 6 Rectangle2D.Double rect; 7 8 public void init() { 9 rect = new Rectangle2D.Double(10, 10, 150, 50); 10 } 11

Page 109: 자바 애플릿 프로그래밍

9.10 9.10 자바 자바 2D2D

12 public void paint(Graphics g) { 13 Graphics2D g2 = (Graphics2D) g; 14 g2.draw(rect); 15 g2.translate(80, 30); 16 g2.rotate(Math.PI/8.0); 17 g2.draw(rect); 18 19 g2.translate(150, 150); 20 for(int i=0; i < 4; i++) { 21 g2.rotate(Math.PI/2.0); 22 g2.drawString("Hello World", 0, 0); 23 } 24 } 25 }

설명 15 g2.translate(80, 30);

(80, 30) 위치로 이동한다 .

16 g2.rotate(Math.PI/8.0);Math.PI/8.0 라디안만큼 회전한다 .

Page 110: 자바 애플릿 프로그래밍

9.10 9.10 자바 자바 2D2D GeneralPath 클래스

직선이나 곡선으로 연결되는 도형을 그릴 수 있는 방법을 제공한다 .

예제 : GeneralRect2.java 1 import java.awt.*; 2 import java.awt.geom.*; 3 import java.applet.*; 4 5 public class GeneralRect2 extends Applet { 6 7 public void paint(Graphics g) { 8 Graphics2D g2 =(Graphics2D) g; 9 g2.setColor(Color.blue); 10 GeneralPath rect = new

GeneralPath(GeneralPath.WIND_EVEN_ODD); 11 rect.moveTo(25.0f, 25.0f); 12 rect.lineTo(100.0f, 25.0f); 13 rect.lineTo(25.0f, 80.0f); 14 rect.lineTo(100.0f, 80.0f); 15 rect.closePath(); 16 g2.fill(rect); 17 } 18 }