1.課題
  Report#2:ディスプレイ出力Javaアプレット{〜11/08(Mon)}
  講義資料のJavaアプレットを参考に、簡単なディスプレイ出力Java
  アプレットを作成せよ。

2.プログラム


/*
   Program     : Oden.java
   Student_ID  : 045754A
   Author      : Hayato MIYAGI
   Date        : 041107(Sun)
   Comments    : おでんアプレットプログラム
*/
import java.applet.*;
import java.awt.*;

public class Oden extends Applet{

    public void paint(Graphics g) {
        int n =3;
        int xdata[] = new int[n];
        int ydata[] = new int[n];
        xdata[0] = 66;
        ydata[0] = 50;
        xdata[1] = 132;
        ydata[1] = 50; 
        xdata[2] = 100;
        ydata[2] = 25;
        int rgb = Color.HSBtoRGB(1.0f, 1.0f, 1.0f);
        setBackground(Color.yellow);
        setForeground(Color.blue);
        g.drawLine(100, 100,100, 200);
        g.setColor(new Color(rgb));
        g.fillPolygon(xdata, ydata, n);
        g.fillOval(75, 50, 50, 50);
        g.fillRect(75, 100, 50, 50);
    }
}       

3.実行結果



4.考察
おでんアプレットプログラムに至るに当たって、
初めに以下のようなプログラムを根底とします。
/*
   Program     : test.java
   Comments    : 基本ソースプログラム
*/

import java.applet.*;
/*java.appletに指定したパッケージ内の型を短い名前で直接参照することができる*/
import java.awt.*;
/*java.awtに指定したパッケージ内の型を短い名前で直接参照することができる*/


public class test extends Applet{
/*testはAppletのサブクラス*/

    public void paint(Graphics g) {
    /*g上にコンポーネントを描画する*/

        setBackground(Color.yellow);
        /*背景を黄色に設定する*/

        setForeground(Color.blue);
        /*描画色を青に設定する*/

        g.drawLine(0, 0, 200, 200);
        /*点(0,0)と点(200,200)を結ぶ線を描画する*/

        g.fillRect(100, 40, 50, 50);
        /*点(100,40)の位置に幅50、高さ50*の四角形を描画して中を塗りつぶす*/
    }
}

---------------------------------------------------------------------Result


次に以下のように上記プログラムを変更します。
/*
   Program     : test3.java
   Comments    : 変更後プログラム1
*/

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

public class test3 extends Applet{

    public void paint(Graphics g) {
        setBackground(Color.yellow);
        setForeground(Color.blue);
        g.drawLine(100, 100,100, 200);
        g.fillRect(75, 40, 50, 50);
    }
}

-------------------------------------------------------------Result


g.drawLine()の中身は座標と幅と高さを変更。g.fillRect()の中身はx座標だけを
変更した所、四角形に一本の棒が突き刺さっているような描画ができました。
さらに以下のように変更してみます。

/*
   Program     : test4.java
   Comments    : 変更後プログラム2
*/

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

              .
		      .
		      .
        g.drawLine(100, 100,100, 400);
        g.fillRect(75, 200, 50, 50);
    }
}

-------------------------------------------------------------Result


ここで、Graphicsクラスに定義されているインスタンスメソッドfillOval()
を宣言します。すると上記のプログラムは次のようになります。

/*
   Program     : test5.java
   Comments    : 変更後プログラム3
*/
import java.applet.*;
import java.awt.*;

			.
			.
			.
			.
        g.drawLine(100, 100,100, 400);
        g.fillOval(75, 150, 50, 50);
        /*新たにg.fillOval()というメソッドを宣言*/

        g.fillRect(75, 200, 50, 50);
    }
}

-------------------------------------------------------------------Result


初めの基本プログラムからあったg.fillRect()の上にg.fillOval()というメソッドを
宣言しました。さらにg.fillOval()の座標を(75,150)とすることでg.fillRect()で
描画された四角形の上に円が描画されることができました。
その次にさらに以下のようなプログラムを参考にしていきたいと思います。
/*
  三角形の描画アプレット
*/

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

public class test6 extends Applet {

    public void paint(Graphics g) {
        int n =3;
        int xdata[] = new int[n];
        int ydata[] = new int[n];
		/*int型配列を用いることによって、三角形の頂点の座標を決定*/
        xdata[0] = 50;
        ydata[0] = 150;
        xdata[1] = 200;
        ydata[1] = 50;
        xdata[2] = 350;
        ydata[2] = 150;
        int rgb = Color.HSBtoRGB(1.0f, 1.0f, 1.0f);
		/*描画色を設定*/
        g.setColor(new Color(rgb));
		/*描画した三角形の中を塗りつぶす色を赤色に設定*/
        g.fillPolygon(xdata, ydata, n);
    }
}
-----------------------------------------------------------------Result


このjavaアプレットを実行すると三角形が画面に出力されます。
上記の三角形アプレットプログラムをtest5.javaの中のインス
タンスメソッドg.drawLine()とg.fillOval()の間に挿入します。
すると以下のようなプログラムとなります。

/*
   Program     : test7.java
   Comments    : 変更後プログラム4
*/
        import java.applet.*;
        import java.awt.*;

   public class test7 extends Applet{

     public void paint(Graphics g) {
        setBackground(Color.yellow);
        setForeground(Color.blue);
        g.drawLine(100, 100,100, 400);
        int n =3;
        int xdata[] = new int[n];
        int ydata[] = new int[n];
        xdata[0] = 65;
        ydata[0] = 50;
        xdata[1] = 130;
        ydata[1] = 50;
        xdata[2] = 100;
        ydata[2] = 25;
        int rgb = Color.HSBtoRGB(1.0f, 1.0f, 1.0f);
        g.setColor(new Color(rgb));
        g.fillPolygon(xdata, ydata, n);
       /*新たにg.setColor()とg.fillPolygon()というメソッドを宣言*/

        g.fillOval(75, 150, 50, 50);
        g.fillRect(75, 200, 50, 50);
     }
}
------------------------------------------------------------------Result


しかし、このままでは三角形は棒に刺さっていませんのでメソッドの座標をさらに
細かく調整していきます。これを以下のように変更します。

/*
   Program     : test8.java
   Comments    : 変更後プログラム5
*/
import java.applet.*;
import java.awt.*;

public class test8 extends Applet{

    public void paint(Graphics g) {
        setBackground(Color.yellow);
        setForeground(Color.blue);
        g.drawLine(100, 100,100, 400);
        int n =3;
        int xdata[] = new int[n];
        int ydata[] = new int[n];
        xdata[0] = 66;
        ydata[0] = 50;
        xdata[1] = 132;
        ydata[1] = 50;
        xdata[2] = 100;
        ydata[2] = 25;
        int rgb = Color.HSBtoRGB(1.0f, 1.0f, 1.0f);
        g.setColor(new Color(rgb));
        g.fillPolygon(xdata, ydata, n);
        g.fillOval(75, 50, 50, 50);
        g.fillRect(75, 100, 50, 50);
   }        
}
-------------------------------------------------------------------Result


最後に棒の高さを調整します。
そして、上記プログラムをキレイにまとめると以下のようになります。

/*
   Program     : Oden.java
   Comments    : 変更後プログラム6->おでんプログラム
*/
import java.applet.*;
import java.awt.*;

public class Oden extends Applet{

    public void paint(Graphics g) {
        int n =3;
        int xdata[] = new int[n];
        int ydata[] = new int[n];
        xdata[0] = 66;
        ydata[0] = 50;
        xdata[1] = 132;
        ydata[1] = 50; 
        xdata[2] = 100;
        ydata[2] = 25;
        int rgb = Color.HSBtoRGB(1.0f, 1.0f, 1.0f);
        setBackground(Color.yellow);
        setForeground(Color.blue);
        g.drawLine(100, 100,100, 200);
        g.setColor(new Color(rgb));
        g.fillPolygon(xdata, ydata, n);
        g.fillOval(75, 50, 50, 50);
        g.fillRect(75, 100, 50, 50);
    }
}    
------------------------------------------------------------------Result


  
以上より、おでんアプレットプログラムの出来上がりです。


5.反省と感想
 今回の出力アプレットの課題を通して感じたことはjavaアプレットは図形、色、彩度、
明度、イメージなどをもの凄くたくさん表現するメソッドが豊富に用意されているん
だなーと感じました。それから、三角形アプレットをおでんのてっぺんに持ってくる
作業は微調整に時間がかかってしまい、苦労しました。
  座標の点(0,0)が左上隅から右下隅に広がっているということに気がつくのも時間かか
りましたし、その後はさらに微調整するときに苦労しました。しかも、適切な数値を与え
なければ三角形が出力されなかったりしてあせりました。
 最後に二つ不思議ほど思ったことがありました。
一つ目は  
setForeground(Color.blue); という部分についてなのですが、初め四角形、円を出力
したときは両方ともきちんと青色だったのに三角形を挿入したとたんに三角形と同様に
四角形と円の両方とも三角形につられて赤色になってしまいました。
g.drawLine(100, 100,100, 200); によって描画されている棒線はきちんと青色に設定
されているのに対し、図形で描画したものは三角形につられて赤色に設定されています。
これはインスタンスメソッドが定義されているクラスに違いがあるために生じる優先順位
があるのでしょうか?
二つ目は
教科書独習JavaのP385に表示されているアプレットは朝5時くらいにTVをつけるとTV番組みが
始まる前に表示されている画面と一緒なのでしょうか?そうだとしたらTVのアノ画面はjava
アプレットを用いて表示されていることになりますよね。このことが事実ならばちょっとした
トリビアですね。

6.参考文献
 独習Java第2版               ジョセフ.オニール 著
                       トップスタジオ  訳
                       武藤 健志   監修
 
戻るべし!