본문 바로가기

카테고리 없음

애플릿 기본 구성 및 활용

애플릿 작성법과 실행 순서

  • 애플릿 작성법
    1. HTML을 통한 실행 클래스 작성
    2. Applet을 상속받는 클래스 작성
    3. 웹 브라우저를 통한 실행 또는 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 의 구조

  • 각 메서드에서 정의할 일 
    1. public void init() : 화면 구성 및 초기화
    2. public void start() : 이벤트 추가 및 스레드 처리
    3. public void update() : 그래픽 초기화
    4. public void paint() : 그래픽 작업
    5. public void stop() : 페이지 업로드에 필요한 작업
    6. public void destroy() : 종료시 메모리 소멸작업
public class 클래스명 extends Applet {
    public void init() {}
    public void start() {}
    public void paint(Graphics g) {}
    public void stop() {}
    public void destroy() {}
}

 

  • 애플릿 실행 순서
    1. HTML 실행
    2. APPLET 태그 중 CODE 속성의 CLASS 호출 (반드시 Applet 클래스 상속)
    3. CLASS public void init() 메서드 실행
    4. CLASS public void start() 메서드 실행
    5. CLASS public void update(Graphics g) 실행
    6. CLASS public void paint(Graphics g) 실행
    7. 스레드 대기 상태
    8. 페이지 이동시 public void stop() 메서드 실행
    9. 브라우저 종료 시 stop() 메서드 호출 후 public void destroy() 메서드 실행
    10. 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를 이용한 윈도우의 계산기를 애필릿으로 만들어 웹 브라우저를 통해 실행해 보자