애플릿 작성법과 실행 순서
- 애플릿 작성법
- HTML을 통한 실행 클래스 작성
- Applet을 상속받는 클래스 작성
- 웹 브라우저를 통한 실행 또는 appletviewer 명령어를 이용한 실행
APPLET 태그
<APPLET CODE="클래스명.class"
WIDTH="픽셀_너비"
HEIGHT="픽셀_높이"
[CODEBASE="애플릿이 위치한 경로"
ALT="애플릿이 표시되지 않는 텍스트 전용 브라우저에서의 표시 내용"
NAME="현재 페이지에 있는 여러개의 APPLET을 구별하기 위한 이름"
ALIGN="애플릿의 정렬방식"
VSPACE="세로 방향의 여백"
HSPACE="가로 방향의 여백"]>
<PARAM NAME="매개_변수명" VALUE="속성값" />
</APPLET>
태그 예제 Round21_Ex01.html
<html>
<head>
<title>제목</title>
</head>
<body>
<center>
<h1>자바 애플릿!!</h1>
<applet code="Round21_Ex01.class" width="300" height="200"></applet>
</center>
</body>
</html>
Round21_Ex01.java
import java.awt.*;
import java.awt.applet.*;
public class Round21_Ex01 extends Applet {
public void init() {
this.setLayout(new BorderLayout());
this.add("North", new Label("sample"));
Lable lb = new Label("Hello Applet!", Label.CENTER);
lb.setFont(new Font("Sans-serif", Font.BOLD, 20));
lb.setBackground(Color.blue);
this.add("Center",lb);
this.add("South", new Button("확인"));
}
}
형식 : Applet 의 구조
- 각 메서드에서 정의할 일
- public void init() : 화면 구성 및 초기화
- public void start() : 이벤트 추가 및 스레드 처리
- public void update() : 그래픽 초기화
- public void paint() : 그래픽 작업
- public void stop() : 페이지 업로드에 필요한 작업
- public void destroy() : 종료시 메모리 소멸작업
public class 클래스명 extends Applet {
public void init() {}
public void start() {}
public void paint(Graphics g) {}
public void stop() {}
public void destroy() {}
}
- 애플릿 실행 순서
- HTML 실행
- APPLET 태그 중 CODE 속성의 CLASS 호출 (반드시 Applet 클래스 상속)
- CLASS public void init() 메서드 실행
- CLASS public void start() 메서드 실행
- CLASS public void update(Graphics g) 실행
- CLASS public void paint(Graphics g) 실행
- 스레드 대기 상태
- 페이지 이동시 public void stop() 메서드 실행
- 브라우저 종료 시 stop() 메서드 호출 후 public void destroy() 메서드 실행
- HTML의 나머지 내용 실행
Applet 클래스와 AudioClip
Applet 메서드
메서드 | 설명 |
getAppletContext() | 현재 웹 페이지에서 애플릿의 작업 영역을 AppletContext클래스에 저장 |
getAudioClip(URL url, String str) | url 경로의 str이라는 이름을 가진 오디오 파일을 AudioClip의 객체로 생성 |
getCodeBase() | applet 태그의 code속성으로 지정되어 있는 클래스 파일이 저장되어 있는 경로 |
getDocumentBase() | 현재 실행중인 HTML 문서가 저장되어 있는 경로 |
getImage(URL url) | url 경로의 이미지 파일을 Image 객체로 생성 |
getParameter(String param) | param 이름으로 전달된 데이터의 값을 얻어 내는 메서드 |
init() | 애플릿 호출 시 가장 처음으로 실행되어 애플릿을 초기화시키는 메서드 |
start() | init() 메서드 호출에 이어서 자동으로 실행되는 메서드 |
stop() | HTML 페이지를 벗어날 때 자동으로 호출되는 메서드 |
resize(int w, int h) | 현재의 애플릿 크기를 폭 w, 높이 h로 재조정하는 메서드 |
showStatus(String msg) | 하단의 상태 표시줄에 msg를 출력하는 메서드 |
실행순서 확인
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class Round21_Ex02 extends Applet {
private static String data = "";
public void init() { data += "init() ->"; }
public void start() { data += "start() ->"; }
public void paint(Graphics g) {
// update(g);
data += "paint() ->";
g.drawString(data, 30, 50);
}
public void stop() { data += "stop() ->"; }
public void destroy() { data += "destroy() ->"; }
}
Round21_Ex02.html
<html>
<head>
<title></title>
</head>
<body>
<center>
<h1>애플릿 메서드 실행순서</h1>
<hr width="80%" />
<applet code="Round21_Ex02.class" width="500" height="100"></applet>
<hr width="80%" />
<a href="Round21_Ex02.java">소스보기</a>
</center>
</body>
</html>
매개변수 확인
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class Round21_Ex03 extends Applet {
String ccc = "";
String ddd = "";
public void init() {
ccc = this.getParameter("aaa");
ddd = this.getParameter("bbb");
}
// public void start() { }
public void paint(Graphics g) {
g.getFont(new Font("Sans-serif", FONT.BOLD, 20));
g.drawString(ccc, 30, 100);
g.drawString(ddd, 30, 150);
}
// public void stop() { }
// public void destroy() { }
}
Round21_Ex03.html
<html>
<head>
<title></title>
</head>
<body>
<applet code="Round21_Ex03.class" width="300" height="200">
<param name="aaa" value="PARK" />
<param name="bbb" value="LEE" />
</applet>
</body>
</html>
시간 표시
import java.applet.*;
import java.awt.*;
import java.util.*;
public class Round21_Ex04 extends Applet implements Runnable {
private Thread currentTh
// public void init() { }
public void start() {
currentTh = new Thread(this);
currentTh.start();
}
// public void update(Graphics g) { }
public void paint(Graphics g) {
Date d = new Date();
g.getFont(new Font("TimesRoman", FONT.BOLD, 25));
g.drawString(d.toString(), 30, 50);
}
// public void stop() { }
// public void destroy() { }
public void run() {
while (true) {
try { Thread.sleep(1000); } catch(InterruptedException e) {}
this.repaint();
}
}
}
Round21_Ex04.html
<html>
<head>
<title></title>
</head>
<body>
<center>
<applet code="Round21_Ex04.class" width="300" height="200"></applet>
</center>
</body>
</html>
텍스트 변경
import java.applet.*;
import java.awt.*;
import java.util.*;
public class Round21_Ex05 extends Applet implements Runnable {
private String data = "";
private String data1 = "";
private int xpos = 0;
private Thread currentTh;
private boolean bool = false;
public void init() {
data = this.getParameter("text");
data1 = this.getParameter("text1");
}
public void start() {
if(currentTh == null) {
currentTh = new Thread(this);
currentTh.start();
}
}
// public void update(Graphics g) { }
public void paint(Graphics g) {
g.getFont(new Font("Sans-serif", FONT.BOLD, 20));
bool = !bool ? g.drawString(data, xpos, 30) : g.drawString(data1, xpos, 30);
}
// public void stop() { }
// public void destroy() { }
public void run() {
Dimension di = this.getSize();
for( int i=0; i<di.getWidth(); i+=5 ) {
xpos = i;
this.repaint();
try { Thread.sleep(80); } catch(InterruptedException e) {}
}
}
}
Round21_Ex05.html
<html>
<head>
<title></title>
</head>
<body>
<center>
<applet code="Round21_Ex05.class" width="500" height="50">
<param name="text" value="A" />
<param name="text1" value="B" />
</applet>
</center>
</body>
</html>
★ 랜덤
import java.applet.*;
import java.awt.*;
public class Round21_Ex06 extends Applet implements Runnable {
private int num = 0;
public void init() {
num = Integer.parseInt(this.getParameter("number"));
}
public void paint(Graphics g) {
Dimension di = this.getSize();
for( int i = 0; i < num; i++ ) {
g.setColor(new Color(
(int)(Math.random() * 256),
(int)(Math.random() * 256),
(int)(Math.random() * 256)
));
int xpos = (int)(di.getWidth() * Math.random());
int ypos = (int)(di.getHeight() * Math.random());
g.getFont(new Font("TimesRoman", FONT.BOLD, 15));
g.drawString("★", xpos, 30);
try { Thread.sleep(100); } catchg (InterrupedException e) {}
}
}
}
Round21_Ex06.html
<html>
<head>
<title></title>
</head>
<body>
<center>
<applet code="Round21_Ex06.class" width="500" height="500">
<param name="number" value="100" />
</applet>
</center>
</body>
</html>
AudioClip
- AudioClip ac = Applet_객체.getAudioClip(URL_객체, 오디오파일명);
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class Round21_Ex07 extends Applet implements ActionListener {
private Image img1 = null;
private Image img2 = null;
private AudioClip ac = null;
private Button start_bt = new Button("시작");
private Button end_bt = new Button("멈춤");
private boolean bool = false;
public void init() {
String img1_str = this.getParameter("img1");
String img2_str = this.getParameter("img2");
String sound_str = this.getParameter("sound");
img1 = this.getImage(this.getDocumentBase(), img1_str);
img2 = this.getImage(this.getDocumentBase(), img2_str);
ac = this.getAudioClip(this.getDocumentBase(), sound_str);
this.setLayout(new BorderLayout());
Panel p = new Panel(new FlowLayout());
p.add(start_bt);
p.add(end_bt);
this.add("South",p);
}
public void start() {
start_bt.addActionListener(this);
end_bt.addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
if(e.getSource() == start_bt){
ac.loop(); //sound를 무한 반복 실행
bool = true;
this.repaint();
} else if(e.getSource() == end_bt){
ac.stop(); //sound를 멈춘다.
bool = false;
this.repaint();
}
}
// public void update(Graphics g) { }
public void paint(Graphics g) {
bool ? g.drawImage(img1, 20, 20, 260, 140, this);
: g.drawImage(img2, 20, 20, 260, 140, this);
}
public void stop() { }
// public void destroy() { }
}
Round21_Ex07.html
<html>
<head>
<title></title>
</head>
<body>
<center>
<h2>Sound & Image!</h2>
<hr width="40%" />
<applet code="Round21_Ex07.class" width="80%" height="80%">
<param name="img1" value="aaa.gif" />
<param name="img2" value="bbb.gif" />
<param name="sound" value="myaudio.au" />
</applet>
<hr width="40%" />
<a href="Round21_Ex07.java">소스보기</a>
</center>
</body>
</html>
애플릿과 그래픽을 이용한 경마 게임 예제
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class Horse extends Canvas implements Runnable {
private Round21_Ex08 parent;
private int number;
private Image stop_horse = null;
private int xpos;
public Horse(Round21_Ex08 p, int num) {
this.parent = p;
this.number = num;
this.stop_horse = p.getImage(p.getCodeBase(), "ho_stop.gif");
}
public void paint(Graphics g) {
Dimension di = this.getSize();
g.drawLine(0, (int)(di.getHeight()/2), (int)di.getWidth(), (int)(di.getHeight()/2));
g.drawImage(stop_horse, xpos, 5, 30, (int)(di.getHeight() - 10), this);
}
public void run() {
stop_horse = parent.getImage(parent.getCodeBase(), "anmimal2011500[1].gif");
Dimension di = this.getSize();
for( int i = 0; i<di.getWidth()-30; i++) {
i += (int)(Math.random()*3) + 1;
xpos = i;
this.repaint();
try {
Thread.sleep(30 + (int)(Math.random()*10));
} catch( InterruptedException e) {}
}
stop_horse = parent.getImage(parent.getCodeBase(), "ho_stop.gif");
parent.setMyData(number);
}
}
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class Round21_Ex08 extends Applet implements ActionListener {
private Label num_lb = new Label("말의 수 = ", Label.RIGHT);
private TextField num_tf = new TextField(5);
private Button set_bt = new Button("설정");
private Button clear_bt = new Button("초기화");
private Panel center_pane = new Panel();
private Label rank_lb = new Label("* 등 수 *");
private Button start_bt = new Button("출발");
private List rank_li = new List(5, false);
private Hourse[] hourse;
privaet static int rank = 1;
public void init() {
this.setLayout(new BorderLayout(5, 5));
this.setBackground(Color.white);
Panel p = new Panel(new GridBagLayout());
p.add(num_lb);
p.add(num_tf);
p.add(set_bt);
p.add(clear_bt);
this.add("North",p);
this.add("Center", center_pane);
Panel p1 = new Panel(new BorderLayout());
Panel p2 = new Panel(new GridLayout(1, 2));
Panel p3 = new Panel(new FlowLayout(FlowLayout.LEFT));
p3.add(rank_lb);
p2.add(p3);
Panel p4 = new Panel(new FlowLayout(FlowLayout.RIGHT));
p4.add(start_bt);
p2.add(p4);
p1.add("North", p2);
p1.add("Center", rank_li);
this.add("South",p1);
}
public void start() {
num_tf.addActionListener(this);
set_bt.addActionListener(this);
clear_bt.addActionListener(this);
start_bt.addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
if( g.getSource() == num_tf || g.getSource() == set_bt ) {
String num_str = num_tf.getText();
if(num_str == null || num_str.trim().length() == 0) return;
int number = 0;
try {
number = Integer.parseInt(num_str);
} catch(NumberFormatException e) {
num_tf.setText("");
return;
}
this.remove(center_pane);
center_pane = new Panel(new GridLayout(number, 1));
horse = new Horse[number];
for(int i = 0; i< number; i++) {
horse[i] = new Horse(this, i);
center_pane.add(horse[i]);
}
this.add("Center", center_pane);
set_bt.setEnabled(false);
this.validate(); // 화면을 갱신하여 현재의 설정이 인식되도록 한다.
} else if( g.getSource() == clear_bt ) {
num_tf.setText("");
set_bt.setEnabled(true);
this.remove(center_pane);
center_pane = new Panel();
this.add("Center",center_pane);
this.validate();
rank_li.clear();
num_tf.requestFocus();
} else if( g.getSource() == start_bt ) {
for( int i = 0; i<hourse.length; i++) {
new Thread(hourse[i]).start();
}
}
}
public void setMyData(int num) {
rank_li.add(rank++ + "등===>" + (num+1) + "번말");
if(rank == horse.length + 1) {
start_bt.setEnabled(true);
rank = 1;
}
}
// public void update(Graphics g) { paint(g); }
public void paint(Graphics g) { }
public void stop() { }
public void destroy() { }
}
Round21_Ex08.html
<html>
<head>
<title>말달리기</title>
</head>
<body>
<center>
<h2>말달리기 게임!</h2>
<hr width="80%" />
<applet code="Round21_Ex08.class" width="80%" height="80%"></applet>
<hr width="80%" />
<a href="Round21_Ex08.java">소스보기</a>
</center>
</body>
</html>
과제
과제1. 그래픽 라운드에서 작성한 그림판 예제를 애플릿으로 바꾸어 보자.
과제2. AWT를 이용한 윈도우의 계산기를 애필릿으로 만들어 웹 브라우저를 통해 실행해 보자