[ MENU ]  [What'sNew ]  [ MEMO  ] [ Application ]  [ Applet ]  [ Java & Linux ]  [ Osusume ] [ 掲示板 ]
MEMO
いつも工事中です...

 < 目 次

  1. Javaを入れる準備(必要な道具類は何?)
  2. JDK1.2のダウンロード(道具を手に入れるには?)
  3. インストール(JDK1.2を使えるようにするには?)
  4. 試飲その1(簡単なプログラムを動かしてみる)
  5. 試飲その2(ウィンドウ表示してみる)(1999.11.14)
  6. main(String args[])について(1999.11.19)
  7. ウィンドウを閉じる仕掛け(その1)(1999.11.21)
  8. ウィンドウを閉じる仕掛け(その2)(1999.11.23)
  9. システムのプロパティを取得、表示してみよう(ラベルについても少々)(1999.12.6)
  10. フォントをいじってみようかな(1999.12.19)
  11. 使用可能なフォントを調べてみようか(1999.12.21)
  12. グラフィックをいじってみる (2000.1.29)
  13. グラフィックその2:もっときれいに! (2000.1.30)
  14. 乱数と"switch"(条件分岐)で占ってあげよう (2000.2.6)
  15. スレッドも使いたいね (2000.2.11)

  ☆参考書籍他 ==> 「おすすめコーナー」として独立しました。


1.Javaを入れる準備
必要な道具類(今のところWindows95または98の上で入れることを前提とします)

  (1)Javaアプリケーションの開発キット(JDK)
      これには色々なヴァージョンがありますが、GUI部品Swingの利用を考えてJDK1.2(別    名 Java 2)にします。(アプレットの動作については、対応しているブラウザーが少ないので    すがそれはそれで、別に考えましょう。とにかく、最初は慣れることが大切ですからね。)
    で、JDK1.2はここからダウンロード出来ます。
         http://java.sun.com/products/jdk/1.2/ja/

    また、書籍や雑誌で、CD−ROMに入っているものもあります。
      たとえば、「速習Java Swingプログラミング」(SOFT BANK Publishing)

  (2)エディタ(プログラムを入力するために必要です)
     ○「メモ帳」: 一番手軽。Windowsに附属しているのですぐに使えます。
     ○「ミュール(mule)」:わたしは主にこれを使っています。( “{” と “}” の対応状況などを       教えてくれたり、プログラムの入力に便利な機能がいろいろあります。)

  どうしても必要な道具は以上の2つだけ。もちろんキーボードはあるのが前提です。マウスだけで文字入力というのは、ちょっとね...
−−−−−−− 「目 次」にもどるよ 
2.JDK1.2のダウンロード
(1)上のサイトにつないで、
    「製品リリース」の「Java 2 SDK v.1.2.2 製品リリース Windows9598/NT版をクリック
(2)Java SDK, Standard Edition 1.2.2 のダウンロードのところで、一括ダウンロードか分割ダウン
  ロードを選んで、continueボタンをクリック
   同じ所にある「インストールの手順」をクリックすると手順説明のページが表示されます。ダウン  ロードには結構時間がかかりますから、その間に眼をとおしておくとよいですね。(また、わたし
  は記憶力に自信がないので、念のためディスクに保存しておいた。)
−−−−−−− 「目 次」にもどるよ 
3.インストール
(1)ダウンロードした場合でもCD-ROMからコピーした場合でも、まず、実行可能形式のファイル
  「jdk1_2_2-win.exe」を起動します(クリックするだけ)。
   途中いくつか確認事項がありますが、特に重要なのは「インストール先のディレクトリ」だけ。
  (ま、これも、特に事情がなければ、デフォルトのままでかまわないけど)
(2)パスの設定
    Windowsでは、通常ドライヴCのルートディレクトリに「Autoexec.bat」というファイルがありま
  す。これをエディタで開いて、たとえばの部分を付け加えます(これは、インストール先ディレク
  トリによって変わります(ドライブEのJavaディレクトリのjdk1.2.2ディレクトリにインストールした場
  合には「;D:\Java\jdk1.2.2\bin」となります)。なお、ここでは、大文字小文字の区別はありま
  せん。
      PATH=C:\WINDOWS;C:\WINDOWS\COMMAND;C:\JDK1.2.2\BIN
       (下線部分は、個々の環境によって異なることがあります)

   1.2の場合は、パス設定はこれだけです。1.0や1.1では、他に Class Path なども設定が必要
  でした。それに較べて間単になりましたね。
−−−−−−− 「目 次」にもどるよ 
4.試飲(ためしのみ)その1
1.おきまりの「Hello, World !」をやってみる
 (1)エディタを立ち上げて、以下のように入力して、「Hello.java」という名前で保存する。
   ここでは、拡張子を必ず java にすることが大切。
// Hello.java(コンソール表示)

class Hello {
 public static void main(String args[]) {
   System.out.println("Hello, World!");
 }
}
               大文字と小文字は区別されるので、注意が必要。

 (2)スタートボタン-->プログラム-->MS-DOSプロンプトを選び、MS-DOSプロンプトのウィンドウを
   開く。

 (3)(1)で保存したファイルのあるディレクトリに移動する。
     じつは、MS-DOSのコマンドなんて、ものすごーく久しぶりで...キンチョーしてしまったの
    ですが...ディレクトリ移動のコマンドはなんとか思い出せました。 cd ですよね。
  
    たとえば、ドライブDのJavaTestというディレクトリに保存した場合は、
       C:¥Windows>cd D:\JavaTest
     これで、プロンプトがD:\JavaTest> となればOK。

 (4)いよいよコンパイル
     プロンプトに続けて javac Hello.java と打ち込んだらエンターキーを押します。で、しばら
    くすると...コンパイル成功の場合は、もとのDOSのプロンプトに戻るだけ(上の例での場合
    なら、D:\JavaTest>に戻る)。失敗の場合は、何らかのエラーメッセージが表示された後、
    DOSプロンプトに戻ります。たとえば、
          error:Can't read: Hell.java
          1error
    というようなエラーメッセージが出たら、ファイル名を再確認しよう。
      それ以外のエラーメッセージが出たときは、Hello.java ファイルをエディタで開いて、入力
    ミスがないかチェックします。たいてい間違いが見つかります。大文字と小文字の間違いや、
    行の最後のセミコロン(;)の有無の間違いが多いですね。あと1つ注意が必要なのは、全角    空白が入っているとエラーになります(文字列として" "ではさんだ部分は別)。

  ☆コンパイルに成功すると、同じディレクトリにソースコードと同名で、拡張子がclassの
   ファイルが作られているはずです。プログラムの実行に必要なのはこのファイルです。

 (5)さっそく実行
     コンパイルがうまく行ったら、さっそくプログラムを実行するのだ。DOSプロンプトに続けて、
    java Hello と打ち込みエンターキーを押します。

     (注意)1.コンパイルの時は、javaを付けたが、実行の時はcは付けない。
          2.コンパイルの時は、ファイル名に拡張子.javaを付けたが、実行の時は付けない。

     うまく行けば、DOSプロンプトのウィンドウに Hello,World!と表示されているはず...
    じつに、ジミなプログラムだけれど、一応ちゃんとしたJavaのプログラムなのだ。

 <まとめ>
    1.エディタで作成したプログラムファイル(ソースコード)は、拡張子.javaを付けて保存。
    2.コンパイルのコマンドは javac ***.java(***はファイル名)
    3.実行コマンドは java ***(拡張子は付けない)
   
−−−−−−− 「目 次」にもどるよ 
5.試飲(ためしのみ)その2
 コンソールへの表示だけというのはあまりにそっけないので、今度はウィンドウを開いて、そこに文句(「ことば」のことね)を表示してみる。文字も少し派手に赤にしてみる。
 ソースコードは次の通り。 
// HelloTest.java(ウィンドウが開きます)

import java.awt.*;

class HelloTest extends Frame {

  String text = "Hello, Java World!";

  public static void main(String[] args) {
    HelloTest ht = new HelloTest();
    ht.setSize(200,100);
    ht.show();
  }

  public void paint(Graphics g){
    g.setColor(Color.red);
    g.drawString(text, 50, 50);
  }
}
 (1)エディタで入力して、HelloTest.java という名前で保存する。
 (2)MS-DOSプロンプトウィンドウを開いて、保存したディレクトリに移動後、
   ・>javac HelloTest.java と入力してリターンキー
      ----コンパイル開始
      ----成功すれば、通常のMS-DOSプロンプトにもどる
   ・>java HelloTest と入力してリターンキー
      ----小さなウィンドウが開いて、Hello, Java World! と赤い文字で表示さているはず。
      ----たぶん左上すみあたりに表示されるでしょう。位置指定をすれば真ん中とかにも
         表示できる。文字の色やサイズも簡単な指定で、変えられる。
    ということで、字体・サイズを変えて見たのが下。赤の部分を付け加えただけ。 
// HelloTest.java(ウィンドウが開きます)

import java.awt.*;

class HelloTest extends Frame {

  String text = "Hello, Java World!";
  Font font = new Font("Dialog", Font.BOLD, 18);

  public static void main(String[] args) {
     HelloTest ht = new HelloTest();
     ht.setSize(250,100);
     ht.show();
  }

  public void paint(Graphics g) {
     g.setFont(font);
     g.setColor(Color.red);
     g.drawString(text, 50, 50);
  }
}
 
上のclassファイル HelloTest.class ダウンロードするには、
右クリックして
「対象をファイルに保存」
を選んで下さい。
上のソースコード HelloTest.java

☆ 注 意 ☆
  今回のプログラムは、ウィンドウを閉じる“仕掛け”が入っていません。閉じるためには、MS-DOS プロンプトのウィンドウに戻って、コントロールキー(Ctrl)とアルファベットのCキーを同時に押して終 了させます。
   これって少し不便なので、“仕掛け”についても調べなくては...
−−−−−−− 「目 次」にもどるよ 
6.main(String args[])はおまじない?
 アプリケーションプログラムのmainメソッドの(String args[])という引数について、ある入門書で「おまじないみたいなものだと思って、とにかくそのまま書いておけば大丈夫」というような説明を読んだ。たしかにそれで大丈夫だったけれど、使い道が何なのか気になっていたのです。[]は配列を表しているようだけど...など、頭の隅に?が引っかかっていて落ち着かなかったのです。
 で、先日、この引数を利用したプログラム例に出会ったので、メモしておくことにしました。
 次のプログラムは、その例を参考にして試しに作ってみたものです。 
// ArgsTest.java

class ArgsTest {
 public static void main(String args[]){
   int n1 = Integer.valueOf(args[0]).intValue();
   int n2 = Integer.valueOf(args[1]).intValue();
   System.out.println(n1+"×"+n2+"="+n1*n2);
 }
}
 このプログラムを実行するには、コンパイルするのは当然として、実行コマンドに2つの整数を付け加えます(java ArgsTest 12 5 などと入力してエンターキーを押す)。ここで入力した2つの整数のうち最初の12がargs[0]に、次の5がargs[1]に取り込まれるんですね。で、画面には12×5=60などと表示されるわけです。
 なお、args[]で取り込まれた内容は、この場合のように数であっても、文字列扱いになります。確かに、Stringと書いてありますものね。そこで、文字列を整数値に変換しているのが、
      Integer.valueOf(args[]).intValue()
です。
 ま、本質的なことはともかくとして、なんとなくargs[]の存在理由が感じられ、頭の隅の?も消えたのです。(単純なヤツですね)
上のclassファイル ArgsTest.class ダウンロードするには、
右クリックして
「対象をファイルに保存」
を選んで下さい。
上のソースコード ArgsTest.java
−−−−−−− 「目 次」にもどるよ 
7.ウィンドウを閉じる仕掛け(その1)
 上の5と6では、閉じないウィンドウが出てきました。これじゃ不便というわけで、ウィンドウを閉じる仕掛けを試してみました。
 ウィンドウを閉じるパターンには大きく分けて2通りあるんですね。
   (1)ウィンドウのタイトルバーにあるクローズボタン(×の付いてるの)をクリックするか、タイト
     ルバーの左隅をクリックすると現れるメニューの「閉じる」を選択することによって、閉じる。
   (2)画面に配置したボタンなどをクリックすることによってウィンドウを閉じるようにする。
 ここでは、ウィンドウの基本的機能として一般に要求される(1)の仕掛けについて、分かる範囲でまとめておきます。

 [最初にイベント処理の基本について]
    マウスを動かしたり、画面上のボタンをクリックしたりすると「イベント」が発生します。この「イ
   ベント」を捉えて色々な処理をします。たとえば、マウスの動きに合わせて絵を移動したり、ボ
   タンをクリックしたら画像を入れ替えたりね。
    この「イベント」を捉えて処理するために、イベントの種類に応じた「イベントリスナーインター
   フェース」を使います。たとえば、マウスの動きによるマウスイベント(MouseEvent)を扱うには
   マウスリスナーインターフェース(MouseListener)を、ボタンをクリックした時に発生するイベン
   ト(ActionEvent)を扱うには「ActionListener」を使います。
    クラスがこうしたリスナー機能を持って、イベントを処理できるようにするためには、必要に応
   じて、「イベントリスナーインターフェース」をインプリメント(implements)します
    今回のウィンドウを閉じる操作に関係するのはウィンドウイベント(WindowEvent)です。この
   イベントを扱うリスナーインターフェースはWindowListenerです。そこで、下のサンプルプログ
   ラムには、”implements WindowListener”という文句が入っています。
    (なお、複数のイベントリスナーインターフェースを使う場合は、カンマで区切って並べれば
     OKです。<例> ... implements WindowListener, MouseListener, ActionListener { ... )
    しかし、WindowListenerをインプリメントしただけではダメ。さらに、次の処理が必要です。
      ○コンストラクタ部分に次の1行を入れます。
           addWindowListener(this);
         (「コンストラクタ」は、各種初期設定などを記述する特別なメソッドで、アプレットの
          場合のini()メソッドに似ている)
      ○リスナーインターフェースが持つメソッドの再定義をする
         (サンプルプログラムのコメント参照)
 
 [サンプルプログラム1]
    これは、上の説明に基づいて作ったウィンドウを閉じるための仕掛けです。中のコメントにも
   書いてあるように、余分な手間がかかる仕掛けなので、実際には使わないでしょう。あくまで
   も、イベント処理の基本の整理に作ってみたものです。
/*/////////////////////////////////////////////////////
* CloseWinListen.java
*   ウィンドウリスナーインターフェースを使用して、ウィンド ウを閉じる
*  仕組みの練習です。
*//////////////////////////////////////////////////////

import java.awt.*;     //ウィンドウを作るので必要
import java.awt.event.*; //イベントを扱うので必要

public class CloseWinListen extends Frame
               implements WindowListener {
      //ウィンドウイベントを扱うためのリスナーインターフェイス
      //をインプリメントしています

  CloseWinListen() {
     addWindowListener(this); //このクラスをリスナーに指定
   }

   public static void main(String args[]) {
    CloseWinListen cw = new CloseWinListen();
    cw.setSize(250,150);
    cw.setTitle("CloseWindow_Listener");
    cw.show();
   }

//ここからは、WindowListenerインターフェースが持つ7つのメソッド
//の再定義です。
   public void windowClosing(WindowEvent e) {
      System.exit(0);
   }
//実際に再定義しているのは上の1つのメソッドだけ。

// 以下は、WindowListenerのメソッドのうち、今回は使用し
//ないものの再定義−−−実は空。使用しなくても定義し直
//しておかないとダメ。
// そこで、「アダプター」クラスを用いると、必要なメソッド
//だけの定義で済むので便利。
   public void windowClosed(WindowEvent e) {}
   public void windowActivated(WindowEvent e) {}
   public void windowDeactivated(WindowEvent e) {}
   public void windowDeiconified(WindowEvent e) {}
   public void windowIconified(WindowEvent e) {}
   public void windowOpened(WindowEvent e) {}
}
 ☆上のコードを入力し(コメントはいらない)、>javac CloseWinListen.java とコンパイルした上で、
  >java CloseWinListen で実行すると、小さなウィンドウが開きます(中味は空で、画面は真っ白
  ですが、ちゃんとしたウィンドウです)。右上のクローズボタン(×ボタン)をクリックすると、ウィン
  ドウがちゃんと閉じるはずです。また、タイトルバーの左隅をクリックすると現れるメニューの「閉
  じる」を選んでも、ウィンドウが閉じます。
上のclassファイル CloseWinListen.class ダウンロードするには、
右クリックして
「対象をファイルに保存」
を選んで下さい。
上のソースコード CloseWinListen.java


 [アダプタークラスを利用したイベント処理]
    上のように、イベントのリスナーインターフェースを直接使うと、必要ないメソッドまで全部再
   定義しなくてはならず、大変です。そこで、対応したリスナーインターフェースを持つアダプター
   クラスの出番です。
    WindowListenerインターフェースを持つアダプタークラスは「WindowAdapter」です。下のサ
   ンプルプログラムは、このWindowAdapterを利用しています。
    アダプタークラスを使う場合は、アダプター自身が対応するリスナーインターフェースをインプ
   リメントしているので、あらためてWindowListenerをインプリメントする必要がありません。
    そのかわりに、コンストラクタのaddWindowListener(this);が次のように変わっています。
           addWindowListener(new CloseWindow());
   (この、CloseWindowというのは、WindowAdapterクラスを継承した新しいクラスで、後ほど
   定義文が出てきます。)
    ようするに、「ウィンドウイベントの処理は、CloseWindowに任せるよ」というところですかね。

 [サンプルプログラム2]
    下が、アダプタークラスを利用した例です。
/*///////////////////////////////////////////////////
* CloseWinAdapt.java
*   WindowAdapterクラスを使って、ウィンドウを閉じる仕掛け。
*////////////////////////////////////////////////////

import java.awt.*; //ウィンドウを作るので必要
import java.awt.event.*; //イベントを扱うので必要

public class CloseWinAdapt extends Frame {

   CloseWinAdapt() {
     addWindowListener(new CloseWindow());
       //CloseWinListenerをリスナーに指定。
       //これは、WindowAdapterクラスを継承したクラ
       //スで、プログラムの最後で定義してある。
   }

   public static void main(String args[]) {
     CloseWinAdapt cw = new CloseWinAdapt();
     cw.setSize(250,150);
     cw.setTitle("CloseWindow_Adapter");
     cw.show();
   }
}

// 以下が、ウィンドウアダプタークラスを継承した、 CloseWinListenerクラス
//の定義。 アダプターを利用すると、必要なメソッドの再定義 だけで済む。

class CloseWindow extends WindowAdapter {
   public void windowClosing(WindowEvent e) {
   System.exit(0);
   }
}
 ☆なお、このプログラムをコンパイルすると、CloseWinAdapt.classという本体のクラスファイルの
  他に、CloseWindow.classというクラスファイルも作成されます。これを、本体と同じディレクトリに
  おいておかないと、実行した時にエラーになるので注意!
上のclassファイル CloseWinAdapt.class ダウンロードするには、
右クリックして
「対象をファイルに保存」
を選んで下さい。
一緒に使うclassファイル CloseWindow.class
上のソースコード CloseWinAdapt.java

 次は、自分で作った「閉じるよボタン」を押すとウィンドウが閉じる仕掛けについての予定です。
−−−−−−− 「目 次」にもどるよ 
8.ウィンドウを閉じる仕掛け(その2)
 アプリケーションプログラムなら、「終了ボタン」とかほしいですね。そこで、ボタンを押したらウィンドウが閉じてプログラムが終了する仕掛けを作ることにしました。
 ボタンをクリックすることで発生するイベントを処理するわけで、イベント処理の基本は(その1)と同じです。ただし、今回発生するイベントは"ActionEvent"なるものなので、これを処理するためのリスナーインターフェースは"ActionListener"というものになります。
 で、まずは、クラスの宣言部分でこのActionListenerをインプリメントするわけです。
        implenents ActionListener {. ...
 また、今回は、イベントの発生源であるボタンにリスナーを登録します。
        btn(ボタンの変数名).addActionListener(this);
 これで、btnにActionListenerが登録され、その処理はthis、つまりこのクラスに任せるよ、ということになるんです。「処理をこのクラスに任せるよ」ということは、このクラスの中で、"ActionListener"が持つメソッドをちゃんと定義して下さいね、ということです。
 で、"ActionListener"のメソッドというのはただ1つ、actionPerformed(ActionEvent e) { } なのです。この{}の中に、ボタンがクリックされた時に行う処理の内容(今回はウィンドウを閉じるという処理です)を記述するのです。
 では、さっそくサンプルプログラムです。
/*/////////////////////////////////////
* ActEvt.java
*  ボタンを押すとウィンドウが閉じる
*   (ActionEventの取扱い例)
*//////////////////////////////////////

import java.awt.*;
import java.awt.event.*;

public class ActEvt extends Frame
               implements ActionListener {
     //ボタンのクリックなどのイベントを処理するためのリスナー
     //インターフェース、ActionListenerをインプリメント

  Button btn; //変数宣言(ボタン)

  ActEvt() { //このくくりはコンストラクタ
    btn = new Button("Close Window");
       //ボタンにClose Windowという文字を表示
    btn.addActionListener(this); //このボタンのイベント処理を
                     //このクラスに任せるよ
    add(btn, "South"); //ボタンを画面の下部に配置する
  }

  public static void main (String args[]) {
    ActEvt ae = new ActEvt();
    ae.setSize(300,200); //ウィンドウのサイズ指定
    ae.setTitle("ActionEvent"); //ウィンドウのタイトル指定
    ae.show(); //ウィンドウを表示します
  }

  public void actionPerformed(ActionEvent e) {
      //このくくりが、ActionEventを処理するメソッドです
    if (e.getSource() == btn) {//イベントの発生元が「btn」と
                    //いう名のボタンだったら
    System.exit(0);   //プログラムを終了してね
    }
  }
}
 このプログラムを実行すると、ウィンドウの下部に細長いボタンが表示されます。なんでこんなに細長いボタンなの?と思うかも知れませんが、それにはふか〜いわけが...とにかく、このボタンには「Close Window」と書いてありますから、クリックすると、ちゃんと窓が閉じるはずです。
 ただし、7のサンプルと違って、×ボタンやメニューの「閉じる」では閉じません。なぜでしょう?だって、例のWindowListenerに関する記述がどこにも入っていないからです。
 そんなのはイヤ、ウィンドウらしくない、という方は、7のサンプル2のウィンドウアダプターを組み込んで下さいね。
上のclassファイル ActEvt.class ダウンロードするには、
右クリックして
「対象をファイルに保存」
を選んで下さい。
上のソースコード ActEvt.java
−−−−−−− 「目 次」にもどるよ 
8−おまけ(その1):ボタンが2つ
 基本的には8のサンプルプログラムと同じです。異なるのは、画面に配置するボタンが2つになった点です。その結果、どちらのボタンがクリックされたかにより処理を分岐することになります。 
/*/////////////////////////////////////
* ActEvt2.java
*  ボタンを押すと...
*   (ActionEventの取扱い例−その2)
*//////////////////////////////////////

import java.awt.*;
import java.awt.event.*;

public class ActEvt2 extends Frame
                 implements ActionListener {
  Button  btnPink, btnClose; //変数宣言(ボタン2つ)

  ActEvt2() {
    btnPink = new Button("I love PINK !");
    btnPink.addActionListener(this);
    btnClose = new Button("Close Window");
    btnClose.addActionListener(this);
    add(btnPink, "North");//このボタンは画面の上部に配置
    add(btnClose, "South"); //このボタンは画面の下部に配置
  }

  public static void main (String args[]) {
    ActEvt2 ae = new ActEvt2();
    ae.setSize(300,200);
    ae.setTitle("ActionEvent2");
    ae.show();
  }
//次がActionEvent処理のメソッドです。押されたボタンによって、処理
//を分けています。
  public void actionPerformed(ActionEvent e) {
    if(e.getSource() == btnPink) { //btnPinkが発生源なら
       setBackground(Color.pink); //背景色をピンクにして
       btnPink.setLabel("Good !"); //ボタンの表示をGood !にする
    } else if(e.getSource() == btnClose) { //btnCloseが発生源なら
       System.exit(0); //プログラムを終了
    }
  }
}
上のclassファイル ActEvt2.class ダウンロードするには、
右クリックして
「対象をファイルに保存」
を選んで下さい。
上のソースコード ActEvt2.java
−−−−−−− 「目 次」にもどるよ 
8−おまけ(その2):ウィンドウらしい?ウィンドウ
 おまけ(その1)にWindowListenerによる処理を付け加えたものです。ついでに、ボタンの配置にパネルを利用してみました。 
/*/////////////////////////////////////
* MyWindow.java
* 好きな方法で窓を閉めてね
*//////////////////////////////////////

import java.awt.*;
import java.awt.event.*;

public class MyWindow extends Frame
                 implements ActionListener {
     //ボタンのクリックなどのイベントを処理するための
     //リスナーインターフェース、ActionListenerをインプリメント

  Button  btnPink, btnClose; //変数宣言(ボタン2つ)
  Panel   pnl; //変数宣言(パネル)

  MyWindow() { //このくくりはコンストラクタ
    btnPink = new Button("I like PINK...");
    btnPink.addActionListener(this);
    btnClose = new Button("Close Window");
    btnClose.addActionListener(this);
       //このボタンのイベント処理をこのクラスに任せる
    pnl = new Panel(); //pnlという名のパネルを作成
    pnl.setBackground(Color.black); //パネルの色は黒ね
    pnl.add(btnPink); //パネルにボタン(btnPink)をのせます
    pnl.add(btnClose); //パネルにボタン(btnClose)をのせます
    add(pnl, "South"); //パネルを画面の下部に配置するよ
    addWindowListener(new CloseWindow());
      //フレームにウィンドウリスナーを登録、処理は
      //CloseWindow(WindowAdapterクラス)にまかせるよ
  }

  public static void main (String args[]) {
    MyWindow mw = new MyWindow();
    mw.setSize(300,200); //ウィンドウのサイズ指定
    mw.setTitle("My Window"); //ウィンドウのタイトル指定
    mw.show(); //ウィンドウを表示します
  }

  public void actionPerformed(ActionEvent e) {
     //このくくりが、ActionEventの処理のメソッドです
    if(e.getSource() == btnPink) {
       setBackground(Color.pink);
       btnPink.setLabel("Good !");
    } else if(e.getSource() == btnClose) {
       System.exit(0);
    }
  }
}

class CloseWindow extends WindowAdapter {
  public void windowClosing(WindowEvent e) {
     System.exit(0);
  }
}
上のclassファイル MyWindow.class ダウンロードするには、
右クリックして
「対象をファイルに保存」
を選んで下さい。
一緒に使うclassファイル CloseWindow.class
上のソースコード MyWindow.java
−−−−−−− 「目 次」にもどるよ 
9.システムのプロパティを取得、表示: 「ラベル」についても少々
 Systemクラスに、システムプロパティを取得するメソッドがあります。それを利用した簡単なアプリケーションです。(20あまりあるシステムプロパティのうち10個を取り扱っています。)
//////////////////////////////////////////////////////
// GetProperty.java (by Totora 1999.12.7)
// 使用中のPCの各種プロパティを取得して表示します
//////////////////////////////////////////////////////

import java.awt.*;
import java.awt.event.*;
import java.util.*; //properties を扱うために必要

public class GetProperty extends Frame implements ActionListener {
//変数を宣言します
  Label lblt;                  //タイトル用ラベル
  Label lbl0,lbl1,lbl2,lbl3,lbl4,lbl5,lbl6,lbl7,lbl8,lbl9;
                         //各プロパティ表示用ラベル
  Panel pnl;         //ラベルやボタンを配置するためのパネル
  Button btn;        //プロパティ取得用ボタン
  String p0,p1,p2,p3,p4,p5,p6,p7,p8,p9;
                //取得した各種プロパティ格納用変数

  GetProperty(){ //コンストラクタ部分:各種初期設定です
    setTitle(" Properties"); //ウィンドウのタイトルを設定
    //以下、変数宣言した部品類を作成します
    btn=new Button("Get Properties");
    btn.addActionListener(this); //リスナーの指定
    lblt=new Label("< Your System Properties >",Label.CENTER);
    lbl0=new Label("language :",Label.CENTER);
    lbl1=new Label("user.dir :",Label.CENTER);
    lbl2=new Label("user.name :",Label.CENTER);
    lbl3=new Label("java.home :",Label.CENTER);
    lbl4=new Label("java.version:",Label.CENTER);
    lbl5=new Label("class.path :",Label.CENTER);
    lbl6=new Label("java.vendor :",Label.CENTER);
    lbl7=new Label("os.arch :",Label.CENTER);
    lbl8=new Label("os.name :",Label.CENTER);
    lbl9=new Label("os.version :",Label.CENTER);

    pnl = new Panel();
    pnl.setLayout(new GridLayout(0,1));
          //このパネルにのせるラベルやボタンを
         //縦一列に配置するようにします。
    pnl.add(lblt); //以下、表示したい順番にパネルにのせる
    pnl.add(lbl0);
    pnl.add(lbl1);
    pnl.add(lbl2);
    pnl.add(lbl3);
    pnl.add(lbl4);
    pnl.add(lbl5);
    pnl.add(lbl6);
    pnl.add(lbl7);
    pnl.add(lbl8);
    pnl.add(lbl9);
    pnl.add(btn); //これで、最下段にボタンが配置される。

    add(pnl); //ウィンドウにパネルをのせます。

    addWindowListener(new CloseWindow());
        //ウィンドウのクローズボタンを有効にするための
        //リスナーを登録。
  }

  public void actionPerformed(ActionEvent e) {
             //ボタンがクリックされたときの処理内容
             //各プロパティを取得し、変数に入れておく。
    p0=System.getProperty("user.language");
    p1=System.getProperty("user.dir");
    p2=System.getProperty("user.name");
    p3=System.getProperty("java.home");
    p4=System.getProperty("java.version");
    p5=System.getProperty("java.class.path");
    p6=System.getProperty("java.vendor");
    p7=System.getProperty("os.arch");
    p8=System.getProperty("os.name");
    p9=System.getProperty("os.version");
    showProp(); //プロパティ表示メソッドを呼ぶ。
  }

  public void showProp() { //表示メソッドです。
    lbl0.setText("your language = " + p0);
    lbl1.setText("user.dir = " + p1);
    lbl2.setText("user.name = " + p2);
    lbl3.setText("java.home =  :" + p3);
    lbl4.setText("java.version= " + p4);
    lbl5.setText("class.path= " + p5);
    lbl6.setText("java.vendor= " + p6);
    lbl7.setText("os.arch = " + p7);
    lbl8.setText("os.name = " + p8);
    lbl9.setText("os.version= " + p9);
  }

  public static void main (String args[]) {
    GetProperty gp = new GetProperty();
    gp.setSize(300,400);
    gp.show();
  }
}

class CloseWindow extends WindowAdapter {
  public void windowClosing(WindowEvent e) {
    System.exit(0);
  }
}

 ○ラベル(Labelクラス)についての覚え書き
   ・読みとり専用文字列を表示
   ・変数宣言は、 Label 変数名;  (例) Label lbl1;
   ・実際に使うためには
        変数名=new Label(); (例) lbl1 = new Label();
      として、インスタンスを作成する。
     その際、次のようにして、表示する文字列を指定することができる。
        lbl1 = new Label("表示したい文字列");
     また、次のようにして、文字列の配置方法を指定することもできる。
        lbl1 = new Label("文字列", Label.CENTER); ・・・文字列を中央に置く場合
         (CENTERをRIGHTにすると右詰め、LEFTにすると左詰めになる。なお、デフォルト
          は左詰め・・・つまり、特に指定しなければ左詰めで表示されわけです。)
   ・実行時に、表示文字列を指定したり、変更したい場合は、
        変数名.setText("文字列"); とする。
   ・実行時に、文字列の配置方法を変更することもできる。
        変数名.setAlignment(Label.RIGHT);
上のclassファイル GetProperty.class ダウンロードするには、
右クリックして
「対象をファイルに保存」
を選んで下さい。
一緒に使うclassファイル CloseWindow.class
上のソースコード GetProperty.java
−−−−−−− 「目 次」にもどるよ 
10.フォントをいじってみようかな
 ラベルやボタンに表示する文字を変更したいことがあります。たとえば、サイズを大きくしたり、太字にしたりなどなど。でも、書式設定のボタン1つで設定なんてわけには行かず、ついつい面倒だからデフォルトのフォントのままで...となりがちでした。でも、いつまでもこんなことではいけないかなと思い、この際、フォントの扱いについて整理しておこうと考えたのでした。
 で、フォントを変更(デフォルトのものから)するには次のようなメソッドを使うのですね。
        setFont(フォント名 , スタイル, サイズ)
   ・ 一般に使用できる主なフォント名は、"Dialog", "Helvetica", "TimesRoman"などで、
    ""で囲んで指示します。
   ・ スタイルは、「装飾無し」,「ボールド体」,「イタリック体」の3つですが、指定するときは、
    それぞれ、Font.PLAIN, Font.BOLD, Font.ITALIC のように指定します。
     また、Font.BOLD+Font.ITALIC とすれば、たとえば、I love you. となります。
      [注意]このスタイルは「定数」扱いですから、変数に代入したい場合は、int型の変数を
          使用します。
   ・ 下のサンプルでは、押されたボタンごとにフォント名やスタイルを変更するので、手間を省くた    め、フォント名とスタイルは変数(fname、style)に代入して処理するようにしてあります。

 さて、今回のサンプルは、該当するボタンを押して、4種類のフォントの3つのスタイルの字体をながめてみようという、ただそれだけのプログラムです。  
///////////////////////////////////////////////
//
// FontChange.java
//   by Totora (1999/12/19)
//
//////////////////////////////////////////////

import java.awt.*;
import java.awt.event.*;

public class FontChange extends Frame implements ActionListener {
  Label lbl1, lbl2;
  Button btn1, btn2, btn3, btn4;
  Button btnP, btnB, btnI, btnBI;
  String fname;
  int style; //フォントのスタイル指定(Font.PLAINなど)は整数値
       //として処理されるので、int型の変数を使用

  FontChange() {
    setTitle("ChangeFont"); //ウィンドウのタイトル
    addWindowListener(new CloseWindow());
    setLayout(new GridLayout(0,2)); //部品類の配置を縦2列にする
    lbl1 = new Label(" My name is ???");
    lbl2 = new Label(" Style");
    btn1 = new Button("Dialog");
    btn2 = new Button("TimesRoman");
    btn3 = new Button("Helvetica");
    btn4 = new Button("DialogInput");
    btnP = new Button("PLAIN");
    btnB = new Button("BOLD");
    btnI = new Button("ITALIC");
    btnBI = new Button("BOLD&ITALIC");
    btn1.addActionListener(this);
    btn2.addActionListener(this);
    btn3.addActionListener(this);
    btn4.addActionListener(this);
    btnP.addActionListener(this);
    btnB.addActionListener(this);
    btnI.addActionListener(this);
    btnBI.addActionListener(this);

    add(lbl1);
    add(lbl2);
    add(btn1);
    add(btn2);
    add(btn3);
    add(btn4);
    add(btnP);
    add(btnB);
    add(btnI);
    add(btnBI);

    fname = ""; //フォントの初期値をDefaultに
    style = 0; //フォントスタイルの初期値をPLAINに
    lbl1.setFont(new Font(fname,style,14));
           //具体的なフォント名、スタイル名を使う代わりに
          //変数で処理しています・・・後の手間を少し省ける
  }

  public void actionPerformed(ActionEvent e) {
    if(e.getSource()==btn1){
      fname = "Dialog";
      lbl1.setText(" My name is Dialog.");
      lbl1.setFont(new Font(fname,style,14));
    } else if(e.getSource()==btn2){
      fname = "TimesRoman";
      lbl1.setText(" My name is TimesRoman.");
      lbl1.setFont(new Font(fname,style,14));
    } else if(e.getSource()==btn3){
      fname = "Helvetica";
      lbl1.setText(" My name is Helvetica.");
      lbl1.setFont(new Font(fname,style,14));
    } else if(e.getSource()==btn4){
      fname = "DialogInput";
      lbl1.setText(" My name is DialogInput.");
      lbl1.setFont(new Font(fname,style,14));
    } else if(e.getSource()==btnP){
      style = Font.PLAIN;
      lbl1.setFont(new Font(fname,style,14));
      lbl2.setText(" style = PLAIN" + "(" + style + ")" );
    } else if(e.getSource()==btnB){
      style = Font.BOLD;
      lbl1.setFont(new Font(fname,style,14));
      lbl2.setText(" style = BOLD" + "(" + style + ")" );
    } else if(e.getSource()==btnI){
      style = Font.ITALIC;
      lbl1.setFont(new Font(fname,style,14));
      lbl2.setText(" style = ITALIC" + "(" + style + ")" );
    } else if(e.getSource()==btnBI){
      style = Font.BOLD + Font.ITALIC;
      lbl1.setFont(new Font(fname,style,14));
      lbl2.setText(" style = BOLD&ITALIC" + "(" + style + ")" );
    }
  }

  public static void main(String args[]){
    FontChange fc = new FontChange();
    fc.setSize(420,150);
    fc.show();
  }
}

////////////////プログラムは以上です。//////////////////

上のclassファイル FontChange.class ダウンロードするには、
右クリックして
「対象をファイルに保存」
を選んで下さい。
一緒に使うclassファイル CloseWindow.class
上のソースコード FontChange.java
−−−−−−− 「目 次」にもどるよ 
11.使用可能なフォントを調べてみようか
 個々の環境によって、javaで使用できるフォントが決まっているようです。そこで、使用できるフォントのリストを取り出し表示するプログラムを作ってみたのです。
 そのフォントリストを取り出すには、次のメソッドを使用します。
     Toolkit.getDefaultToolkit().getFontList()
 今回のプログラムでは、使用可能なフォント名をそのフォントで表示するため、ラベルを使うことにしました。けれど、環境によってフォントの数が一定でないので、ラベルの数を事前に決められません。
どーしよー...で、VBで使った(ような気がする)「動的配列」のような感じで処理できるんじゃなかろーか、と勝手に決めたのです。
 フォント名の表示に使うラベルは、Label の配列 lblFn[] として宣言します。次に、コンストラクタの中で事前準備として、3つの処理をしておきます。
 (1)そのマシン環境で使用できるフォント数を取り出して、変数nに入れておく。(nはint型の
   変数として宣言してあります)
     n = Toolkit.getDefaultToolkit().getFontList().length;
 (2)lblFn[]のサイズをnを使って指定
     lblFn[] = new Label[n];
 (2)forループを使って、n個のラベル(のインスタンス)を作成し、パネルにのせておく。
     for(int i=0; i<n; i++){
       lblFn[i] = new Label();
       pnl.add(lblFn[i]);
     }
   ※じつは、この処理を忘れていたため動かず、しばらく悩んでいたのです。
   ※なお、フォント名を取り込む変数 flist も配列にしてあり、lblFn と同様、nでサイズを
    指定しています。
 あとは、イベント処理のメソッド内で、使用可能フォントリストを、flist[n] に取り込んだ上、それぞれのラベル lblFn[n] に表示します。
/////////////////////////////////////////////
// Fontlist1.java  (by Totora)
/////////////////////////////////////////////

import java.awt.*;
import java.awt.event.*;

public class Fontlist1 extends Frame implements ActionListener {
  String flist[];
  int n;
  Label lblFn[];
  Label lblTitle;
  Panel pnl;
  Button btn;

  Fontlist1() {
    setTitle("GetFontlist"); //ウィンドウのタイトルを設定
    pnl=new Panel(); //パネルpnl(のインスタンス)を作成
    pnl.setLayout(new GridLayout(0,1));
     //このパネルには、部品(ボタンやラベル)を縦1列に並べます
    btn=new Button("GetFontList"); //ボタンbtn(のインスタンス)を作成
    btn.addActionListener(this); //このボタンがクリックされた時の処理
     //のためのリスナーを登録
    pnl.add(btn); //パネルにボタンをのせます。

    n = Toolkit.getDefaultToolkit().getFontList().length;
      //使用可能なフォントの数を取得して、その数を変数nに代入

      //次の2行は、タイトル用のラベルの設定です。
    lblTitle = new Label("使用可能なフォント数="+n);
    lblTitle.setFont(new Font("Dialog", Font.BOLD, 12));
    pnl.add(lblTitle); //上で作成したラベルをパネルにのせます

      //次の2行で、flistとlblFnの配列のサイズ指定にnを使用
    flist = new String[n];
    lblFn = new Label[n];

      //次のforループで、フォント数分のラベルを作成し、
      //パネルにのせます。
    for(int i=0; i<n; i++){
      lblFn[i] = new Label();
      pnl.add(lblFn[i]);
    }

    add(pnl); //パネルをウィンドウにのせます。
  }

  public void actionPerformed(ActionEvent e) { //イベントの処理内容です
    if(e.getSource() == btn) {
    lblTitle.setText(" 使用可能フォント見本");
                        //タイトルの表示を変更
    for(int i=0; i<n; i++) {
      flist[i]=Toolkit.getDefaultToolkit().getFontList()[i];
        //使用可能なフォント名をflistの配列に格納
      lblFn[i].setFont(new Font(flist[i], Font.PLAIN, 16));
        //各ラベルのフォントを、表示するフォント名に対応し
        //たフォントに設定
      lblFn[i].setText((i+1) + "." + flist[i]);
        //ラベルに表示するフォント名を指定
    }
    }
  }

  public static void main (String args[]) { //お決まりのメインメソッド
    Fontlist1 f = new Fontlist1();
    f.pack(); //ウィンドウのサイズを指定する代わりの処理
    f.show();
  }
}
      ***注意 *** このプログラムは、ウィンドウを閉じるメソッドを入れてありません。 
上のclassファイル Fontlist1.class ダウンロードするには、
右クリックして
「対象をファイルに保存」
を選んで下さい。
上のソースコード Fontlist1.java

 なお、このプログラムのソースコードを、Java2でコンパイルすると「推奨されないメソッドを...」といった「警告」が出されます(getFontList()というメソッドに関するもの)が、コンパイルはしてくれていますので動きます。警告に従って新しいメソッドを使うと1.1環境で動かなくなるので、そのままにしてあります。
  それにしても、javaでのフォントの扱いが、まだよく分からないのです。jdkの1.1と1.2ではフォント名も変わっているみたいだし...だれか教えて...
−−−−−−− 「目 次」にもどるよ 
12.グラフィックをいじってみる
 VBやDelphiのくせか、なにかと「ボタン」や「ラベル」を使ってしまいまう。特に、SwingのGUI部品はずいぶんと機能もアップした上、「見映え」も良くなったので、つい使ってみたくなる。でも、やはり、ちょっと重い...ま、わたしのマシンの能力の問題もあるんでしょうがね。
 グラフィックで処理できるところは、ボタン類を使わずに済ますことも考えよう、ということで、まずは基本中の基本から復習することにした。
 今回は、直線・四角形・円(楕円)の描き方なのです。"art"なんて名前が付いてるけれど、あくまでも基本技術の確認のためのもの。
 で、座標は、画面(ウィンドウ、フレーム)の左上の角が(0, 0)なんですね、やっぱり。なかなかなじめなくてこまります。
//Lineart.java (by Totora)

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

public class Lineart extends Applet
{
  public void paint(Graphics g)
  {  //グラフィックを描くには、Graphicsクラスのオブジェクトを使用
    //慣習?に従って"g"としておく。

  //直線を引くには
  // drawLine(描画開始点のx座標, y座標, 終了点のx座標, y座標);
   g.drawLine(50,30,350,30);
   g.drawLine(50,30,350,40);
   g.drawLine(50,30,350,50);
   g.drawLine(50,30,350,60);
   g.drawLine(50,30,350,60);
   g.drawLine(50,30,350,70);
   g.drawLine(50,30,350,80);
   g.drawLine(50,30,350,90);
   g.drawLine(50,30,350,100);
   g.drawLine(50,30,350,110);
   g.drawLine(50,30,350,120);

   g.drawLine(50,120,350,30);
   g.drawLine(50,120,350,40);
   g.drawLine(50,120,350,50);
   g.drawLine(50,120,350,60);
   g.drawLine(50,120,350,60);
   g.drawLine(50,120,350,70);
   g.drawLine(50,120,350,80);
   g.drawLine(50,120,350,90);
   g.drawLine(50,120,350,100);
   g.drawLine(50,120,350,110);
   g.drawLine(50,120,350,120);
     //このくらい手間かけると、さすがの私でも覚えるのです
     //っていうか、手間をかけないと覚えないわたしなのですね

 //四角形を描くには
 // drawRect(基準点のx座標, y座標, 幅の値, 高さの値);
 // 基準点は、描く四角形の左上の頂点
   g.drawRect(50,150,60,60);
   g.drawRect(130,150,80,40);
   g.drawRect(230,150,100,20);

 //円・楕円を描くには
 // drawOval(基準点のx座標, y座標, 幅の値, 高さの値);
 // 基準点は、円(楕円)に外接する正方形(長方形)の左上の頂点
   g.drawOval(190,250,20,20);
   g.drawOval(170,240,60,40);
   g.drawOval(150,230,100,60);
   g.drawOval(120,220,160,80);
  }
}
上のclassファイル Lineart.class ダウンロードするには、
右クリックして
「対象をファイルに保存」
を選んで下さい。
上のソースコード Lineart.java
htmlファイル Lineart.html
***補足***
  ・今回から、{ }の配置を変えてみた。この方が対応関係が少し分かりやすいかな?
  ・上のLineart.htmlをクリックするとアプレットの中味を確認できる。
−−−−−−− 「目 次」にもどるよ 
13.グラフィックその2:もっときれいに!
 「グラフィック」というからには”美しく”あってほしい。なんとなく、そんな気がする。同じ線や○でも、カラフルな方が幸せな気分...で、色を付けてみることにした。
   public void paint(Graphics g)
   {
     g.setColor(Color.色の名前);;
      これ以降、線や図形は指定した色で描画される

 なお、四角や円(楕円)の中を塗りつぶしたい場合は、g.fillRect(4つの引数)やg.fillOval(4つの引数)を使う。これらの引数は、drawRect, drawOval の場合と同じ。
 (注意)fillRect や fillOval など、塗りつぶし描画をすると、その前に描いてあった図形や
     文字も塗りつぶされてしまう。

 ○「文字」も描ける
     グラフィックオブジェクトを使って、文字も描ける。
       g.drawString("文字列",基準点のx座標,y座標);
         (この場合の基準点は、文字列の左下端になるので注意が必要
 で、今回のプログラムでは、とにかく色を使ってみると同時に、グラフィックを利用したボタンも作ってみました。
//Colorart.java
// by Totora(2000/1/30)

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

public class Colorart extends Applet
                 implements MouseListener
 //マウスイベントを処理するためにMouseListenerをインプリメントする
{

  int ck, sk; //マウスの状態をチェックするための変数

 public void init()
 {
   ck = 0;
   sk = 0;
   setBackground(Color.pink); //これは背景色の指定(ピンク)
   addMouseListener(this); //マウスの操作に応じた処理をするための
                   //リスナーを登録
 }

 public void paint(Graphics g)
 {
   g.setColor(Color.blue); //これが、描画色の指定(青)
   g.drawLine(30,50,300,50);

   g.drawLine(30,55,300,55); //線を太くしてみましょう(3倍)
   g.drawLine(30,56,300,56); //Swingではこんなことしなくても大丈夫
   g.drawLine(30,57,300,57);

   g.setColor(Color.green); //描画色を緑に
   g.drawRect(50,65,30,30);
   g.setColor(Color.yellow); //描画色を黄色に
   g.fillRect(100,65,30,30); //四角形の内部を塗りつぶします
      //fillRect(基準点x座標, y座標, 幅, 高さ); drawRectと同じ
   g.setColor(Color.blue); //描画色を青に
   g.drawRect(150,65,30,30);
   g.setColor(Color.orange); //描画色をオレンジに
   g.fillRect(200,65,30,30);
   g.setColor(Color.magenta);//描画色をマゼンタに
   g.fillRect(250,65,30,30);

   g.setColor(Color.white);
   g.setFont(new Font("Helvetica", Font.BOLD, 32));
   g.drawString("Color Art", 95,45);

  //ここからは、ボタンがクリックされたときの処理
    if(ck == 0 && sk == 0) //初期状態
   {
     g.setColor(Color.green);
     g.fill3DRect(130,115,80,30,true);
       //fill3DRectは、四角形に立体感を与えます
       //4つ目までの引数はfillRectと同じ。5つ目のtrueは凸形態の指定
     g.setColor(Color.orange);
     g.setFont(new Font("Dialog", Font.BOLD,12));
     g.drawString("PUSH ME!", 140,135);
       //文字の描画も、グラフィックとして処理できる
       //drawString("文字列", 基準点x座標 , 座標y);
       //基準点は、文字列の左下隅 --- 注意!
   }else if(ck == 1 && sk == 0) //ボタン上でマウスが押された時
   {
     g.setColor(Color.green);
     g.fill3DRect(130,115,80,30,false); //引数falseで凹形態を指定
     g.setColor(Color.gray);
     g.setFont(new Font("Dialog", Font.BOLD,12));
     g.drawString("PUSH ME!", 140,135);
   }else if(ck == 0 && sk == 1) //ボタン上でマウスが押された後はなされた時
   {
     g.setColor(Color.green);
     g.fill3DRect(130,115,80,30,true); //ボタンを凸状態にもどす
     g.setColor(Color.orange);
     g.setFont(new Font("Dialog", Font.BOLD,12));
     g.drawString("PUSH ME!", 140,135);

     //色とサイズを変えて、楕円を描画
     //fillOvalは、図形内部を塗りつぶす。引数の指定は、drawOvalと同じ
     g.setColor(Color.green);
     g.fillOval(50,170,250,120);
     g.setColor(Color.orange);
     g.fillOval(80,190,190,80);
     g.setColor(Color.blue);
     g.fillOval(110,210,130,40);
     g.setColor(Color.magenta);
     g.fillOval(140,220,70,20);

     //文字列の色を変えて少しずらして描画することで,立体感を出す
     g.setColor(Color.white);
     g.setFont(new Font("Helvetica",Font.BOLD,38));
     g.drawString("GRAPHICS",70,224);
     g.setColor(Color.gray);
     g.drawString("GRAPHICS",73,225);
   }
 }

 public void update(Graphics g) //画面のちらつきを抑えるために使われる
 {        //今回は、必ずしも必要ない
   paint(g);
 }

 public void mousePressed(MouseEvent e) //マウスが押された時の処理
 {
   int cx,cy;

   cx = e.getX(); //マウスが押された位置のx座標を取得しcxに入れる
   cy = e.getY(); //マウスが押された位置のy座標を取得しcyに入れる

   if(cx >= 130 && cx <= 210 && cy >= 115 && cy <= 145)
          //マウスが押された位置が、ボタンの領域内だったら
   {
     ck = 1; //チェック用変数ckに1を入れる(初期値は0)
     repaint(130,115,80,30); //描画し直す
   }
 }

 public void mouseReleased(MouseEvent e)
 {
   int cx,cy;

   cx = e.getX();//マウスがはなされた位置のx座標を取得しcxに入れる
   cy = e.getY(); //マウスがはなされた位置のy座標を取得しcyに入れる

   if(cx >= 130 && cx <= 210 && cy >= 115 && cy <= 145)
         //マウスがはなされた位置が、ボタンの領域内だったら
   {
     ck = 0; //変数ckの値は0に戻す
     sk = 1; //変数skの値を1に変更(初期値は0)
     repaint(); //描画し直し
   }
 }

//以下の3つのメソッドは、なにもしない
//MouseListenerをインプリメントしているので、使用しないメソッドも
//このように定義し直さなくてはならない。
 public void mouseClicked(MouseEvent e){}
 public void mouseEntered(MouseEvent e){}
 public void mouseExited(MouseEvent e){}

}

/*********** プログラムは以上 ************
* MouseAdapterというクラスを利用すると、最後の空のメソッドを書く必要
*なくなるのだけれど、事情があって使用していない。
*/
上のclassファイル Colorart.class ダウンロードするには、
右クリックして
「対象をファイルに保存」
を選んで下さい。
上のソースコード Colorart.java
htmlファイル Colorart.html
        *上のColorart.htmlをクリックするとアプレットの中味を確認できる。
−−−−−−− 「目 次」にもどるよ 
13-おまけ−ボタンに絵を描いてみる
 Graphicsのオブジェクトを利用すると、いろいろな物に絵(グラフィックとしての文字も)を描けるらしい。そこで、ボタンで試してみることにした。でも、どーしたら...???実際の方法は書いてなかったし...ま、てきとーにやってみますか。と、いつもの調子でやってみたら、一応描けたみたい。
 public void paint(Graphics g) { } という例のメソッドを持つ、新しいボタンのクラスを作ればなんとかなるかな、ということでやってみたのが、今回のアプレット(ボタンが表示されるだけ)です。
 なお、appletviewer では表示されますが、IE(v.4) ではうまく表示されませんでした。
/////////////////////////////////////////////////
// GrBtn.java
// by Totora(2000/1/30)
// *** *** *** *** *** *** *** *** *** *** ***
// Graphicsオブジェクトを使って、ボタンの表面に
// 絵や文字を描いてみた...だけ
/////////////////////////////////////////////////

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

public class GrBtn extends Applet
{
  NewBtn nbt;   //NewBtnは、Buttonクラスを継承した新しいクラス
           //あとで定義されます
  public void init()
  {
    setLayout(new BorderLayout());
    nbt = new NewBtn();
    add(nbt, "Center");
  }

 class NewBtn extends Button //新しいクラスの定義です
 {
  public void paint(Graphics g)
  {
    g.setColor(Color.red);
    g.fillOval(20,15,50,50);
    g.setColor(Color.blue);
    g.setFont(new Font("Helvetica", Font.BOLD, 24));
    g.drawString("GrButton",45,55);
  }  //これで、ボタンに赤い円と"GrButton"という青い文字が
 }   //表示される。
}

/***************** 以 上 ****************************
*
* ボタンにでもグラフィックを描けるんだ、ということを
*確認しただけ。実際に使う気にはなれないか...
* なお、インナークラスを使用しているため、コンパイル
*すると、"GrBtn.class"と"GrBtn$NewBtn.class"の2つの
*クラスファイルが作られるので、同じフォルダに置く。
*/
上のclassファイル GrBtn.lzh ダウンロードするには、
右クリックして
「対象をファイルに保存」
を選んで下さい。
上のソースコード GrBtn.java
      
−−−−−−− 「目 次」にもどるよ 
14.乱数と"switch"で占ってあげよう
 いままで練習してきた、イベント処理・フォント・グラフィックを利用して、おあそびプログラムを組んでみることにしました。占いアプレットです。そのために、新しく「乱数」とswitch文も使ってみることにしました。
 【乱数の処理:Math.random()】
    num を int型の変数とすると、
    num = (int)(Math.random()*5で、0〜4のいずれかの整数値がnumに格納される。
     つまり、(int)(Math.random()*nで、0からn-1の範囲の整数をランダムに作れるということ。
    詳しい理由は解説書を読みましょう。
 【switch文による条件の分岐】
    「もし明日雨ならば、穴を掘ろう。雨でなければ、木を切ろう。」など、日々の生活でも、
   いろいろな条件によって行動の仕方が決められるものです。プログラムにも条件による
   処理の分岐がつきもの。
    イベント処理の例では、if文による条件分岐を扱ってきた。今回は、switch文での処理
   を試してみる。
    <switch文の基本的な使い方>
       変数(num)に入っている値によって分岐処理する例。numには0,1,2のいずれ
      かが入っているものとする。
         switch(num
         
           case 0右を向く;(numの値が0ならば)
                  1回おじぎをする;
                  break;
           case 1左を向く;(numの値が1ならば)
                  右手をあげる;
                  break;
           case 2後ろを向く;(numの値が2ならば)
                  break;
         
default : なにかする;(numの値がいずれにもあてはまらなかった時の
                         ため)
         
/*//////////////////////////////////
* Uranai.java
* by Totora(2000/2/6)
*///////////////////////////////////

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

public class Uranai extends Applet implements ActionListener
{
 Panel pnl;
 Button btnStart, btnReset;
 int flag;
 int numUnsei, numDirect, numColor;

 public void init()
 {
  setLayout(new BorderLayout());
  pnl=new Panel();
  pnl.setLayout(new GridLayout(0,2));
  btnStart=new Button("お願いします");
  btnReset=new Button("ありがとう");
  btnStart.addActionListener(this);
  btnReset.addActionListener(this);
  pnl.add(btnStart);
  pnl.add(btnReset);
  add(pnl, "South");

  flag=0;
  btnReset.setVisible(false);
  setBackground(Color.black);
 }

 public void actionPerformed(ActionEvent e)
 {
  if(e.getSource()==btnStart)
  {
   flag=1;
   numUnsei=(int)(Math.random()*5);
   numDirect=(int)(Math.random()*8);
   numColor=(int)(Math.random()*8);
   btnReset.setVisible(true);
   btnStart.setVisible(false);
   repaint();
  }
  else if(e.getSource()==btnReset)
  {
   flag=0;
   btnStart.setVisible(true);
   btnReset.setVisible(false);
   repaint();
  }
 }

 public void paint(Graphics g)
 {
  g.setColor(Color.red);
  g.setFont(new Font("Dialog", Font.BOLD, 36));
  g.drawString("八 卦 堂", 110,46);

  if(flag==0)
  {
   g.setColor(Color.white);
   g.setFont(new Font("Dialog", Font.BOLD, 24));
   g.drawString("占ってしんぜよう", 80,90);
   }
  else
  {
    g.setFont(new Font("Dialog", Font.BOLD, 20));
    switch(numUnsei)
    {

     case 0 : g.setColor(Color.pink);
      g.drawString("あなたの運勢は、大吉です!!", 50,100);
      break;
     case 1 : g.setColor(Color.green);
      g.drawString("あなたの運勢は、中吉です!", 50,100);
      break;
     case 2 : g.setColor(Color.gray);
      g.drawString("あなたの運勢は、小吉です。", 50,100);
      break;
     case 3 : g.setColor(Color.yellow);
      g.drawString("あなたの運勢は、凶です!", 50,100);
      break;
     case 4 : g.setColor(Color.red);
      g.drawString("あなたの運勢は、大凶じゃ!!", 50,100);
      break;
    }
    switch(numDirect)
    {
     case 0 : g.setColor(Color.cyan);
           g.drawString("東方に行く", 80,125);
           break;
     case 1 : g.setColor(Color.cyan);
           g.drawString("西方に向かう", 80,125);
           break;
     case 2 : g.setColor(Color.cyan);
           g.drawString("南方に風", 80,125);
           break;
     case 3 : g.setColor(Color.cyan);
           g.drawString("北方より来たらん", 80,125);
           break;
     case 4 : g.setColor(Color.cyan);
           g.drawString("南東にて始まる", 80,125);
           break;
     case 5 : g.setColor(Color.cyan);
           g.drawString("南西にて待つ", 80,125);
           break;
     case 6 : g.setColor(Color.cyan);
           g.drawString("北東に求む", 80,125);
           break;
     case 7 : g.setColor(Color.cyan);
           g.drawString("北西にあり", 80,125);
           break;
    }
    switch(numColor)
    {
     case 0 : g.setColor(Color.red);
           g.drawString("色なら紅",100,150);
           break;
     case 1 : g.setColor(Color.white);
           g.drawString("色なら白", 100,150);
           break;
     case 2 : g.setColor(Color.yellow);
           g.drawString("色なら黄", 100,150);
           break;
     case 3 : g.setColor(Color.green);
           g.drawString("色なら緑", 100,150);
           break;
     case 4 : g.setColor(Color.white);
           g.drawString("色なら黒", 100,150);
           break;
     case 5 : g.setColor(new Color(180,50,0));
           g.drawString("色なら茶", 100,150);
           break;
     case 6 : g.setColor(new Color(230,0,255));
           g.drawString("色なら紫", 100,150);
           break;
      case 7 : g.setColor(new Color(255,230,0));
           g.drawString("色なら山吹", 100,150);
           break;
    }
  }
 }
}
 かなりごり押しで作ってしまった。新しい知識を身に付けるには、効率やスマートさは脇に置いて、ひたすら基本パターンを繰り返すことが大切だから...とかいって、実は、考えるのが面倒なだけかもしれない...ものぐさついでに、コメントもはぶいてしまった。そのうちね...
 で、このアプレットで占ってみたい方はこちらです。
−−−−−−− 「目 次」にもどるよ 
15.スレッドも使いたいね
 アニメーションはもちろん、ちょっと変化のある画面を作りたいときには「スレッド」が便利ですね。アプレットでは必需品みたい。そこで、この「スレッド」を利用して「八卦堂シリーズ」のオープニング画面を作ってみることにした。
 【スレッド(Threadクラス)を利用するためには】(ここでは、Appletでの使用が前提)
    −−−なお、ここでは、「できるだけ簡単に」を基本とする。
  (1)Runnableというインターフェイスをインプリメントし、スレッドを宣言する
      −−−とにかく、作成するアプレットのクラス宣言部分を次のようにすればOK
      public void アプレット名 extends Applet implements Runnable
       
        Thread th; (スレッドの名称はthでなくてもかまわない)

  (2)start()メソッドで、スレッドのインスタンスを作る
      public void start()
      {
        th = new Thread(this);
        th.start();
       }

  (3)stop()メソッドに、スレッド停止処理を記述
       public void stop()
      {
        Thread = null;
       }

  (4)run()メソッドで、描画や時間処理関連の設定を行う
      −−−おおよそ次のようなパターンになる
       public void run()
      {
        Thread me = Thread.currentThread();
        While(th == me)
            (もっと単純な方法もあるけれど、jdk1.18など新しいバージョン
             では、この形の処理がお勧めのようです。)
         {

            描画のための条件設定の変更など、一定時間ごとに実行したい
           処理内容をここに記述−−たとえば、アニメーションで絵に動きを与え
           るために、少しずつ表示位置を変更するなど
            (ここでの設定に基づく実際の描画内容は、paint(Graphics g){ }
             に記述する
           repaint() ---上での設定に基づく再描画を指示
           try
           {
             th.sleep(500); スレッドの休止時間(繰り返し処理の間隔)を指定
                    ( )内の値の単位はミリ秒(1/1000秒)
           }
            catch(InterruptedException e){}
              −−−th.sleep()は、かならずtry{ }の中に記述し、その後には
                 catch(interruptedException e){}を付ける
                  (「例外処理」というものの関係)
         }
  (5)実際の描画内容をpaint()メソッドに記述する

    ・おおよそ、以上でスレッドを利用できる。スレッドの取扱い方は他にもあるけれど、
     これでも動く。
    ・(1)(2)(3)は定型として、ほとんどこのまま使えばOK。(4)も太字部分はほぼ
     定型と考えて大丈夫。

【スレッドを使ったサンプル:八卦堂のオープニング画面候補】
/******************************************************
* HakkeOpen0.java
*
* スレッドの取扱い練習用サンプル(by Torora)
*  3種類の文字列を、ランダムな順番にランダムな位置に
* 5つの色で表示する。
*/******************************************************
import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class HakkeOpen0 extends Applet implements Runnable
{
 int i; //文字色指定用変数
 int px, py, mn; //描画位置、描画文字列指定用変数
 String mesg[]; //表示文字列用配列
 Color col[]; //描画色用配列
 Thread th; //スレッド

 public void init()
 {
  setBackground(Color.black);//背景を黒に
  i=0; //初期化
  col=new Color[5]; //描画色用配列サイズ指定
  col[0]=Color.red; //以下配列内容指定
  col[1]=Color.green;
  col[2]=Color.yellow;
  col[3]=Color.cyan;
  col[4]=Color.orange;
  mesg=new String[3]; //文字列用配列サイズ
  mesg[0]="当たるも"; //以下配列内容
  mesg[1]="当たらぬも";
  mesg[2]="はっけ";
 }

 public void start() //スレッド開始のメソッド
 {
  th=new Thread(this);
  th.start();
 }

 public void stop() //スレッド処理停止のメソッド
 {
  th=null;
 }

 public void run() //再描画に関する設定や時間管理の設定
 {
  Thread me=Thread.currentThread();
   while(th==me)

  {
   //次の2行で、乱数により、文字列の表示位置を取得
   px=(int)(Math.random()*150);//文字列のx座標
   py=(int)(Math.random()*85+10); //文字列のx座標

   i=i+1; //表示色指定変数の値を1増やす
   if(i>4) //4を越えたら0に戻す(配列サイズは4なので)
   i=0;
   mn=(int)(Math.random()*3); //表示文字列配列番号を乱数で取得

   repaint(); //上で設定した条件での再描画を指示
   try
    {
     th.sleep(1000);
//1000ミリ秒(1秒)停止
      //これにより、約1秒間隔で文字が表示される
   }
   catch(InterruptedException e){ }
  }
 }

 public void paint(Graphics g) //描画メソッド
 {
  g.setColor(col[i]); //配列番号iの色を描画色に指定
  g.drawString(mesg[mn],px,py); //配列番号mnの文字列を
                    //座標(px,py)に表示
 }
}
このアプレットの確認はこちらです。


[ MENU ]  [What'sNew ]  [ MEMO  ] [ Application ]  [ Applet ]  [ Java & Linux ]  [ Osusume ] [ 掲示板 ]

メール mailto:to_to_ra@geocities.co.jp