広告

■□■□■□■□■□■□■□■□■□■□■□■□■□■□■
                      2010年01月20日

    Java総合講座 - 初心者から達人へのパスポート
                  2009年11月開講コース 010号

                                セルゲイ・ランダウ
 バックナンバー: http://www.flsi.co.jp/Java_text/
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■


-------------------------------------------------------
・現在、このメールマガジンは以下の2部構成になっています。
[1] 当初からのコース:毎週日曜の夜に発行
   これは現在、中級レベルになっています。
[2] 2009年11月開講コース:毎週水曜の夜に発行
   これは現在、初心者向けのレベルになっています。
・このメールマガジンは、画面を最大化して見てください。
小さな画面で見ていると、不適切な位置で行が切れてしまう
など、問題を起すことがあります。
・このメールマガジンに掲載されているソース・コード及び
文章は特に断らない限り、すべて筆者が著作権を所有してい
ます。また、これらのソース・コードは学習用のためだけに
提供しているものです。
-------------------------------------------------------


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
(2009年11月開講コース)010号
 (当記事はvol.010のリバイバル(revival)版です。)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


========================================================
◆ 01.対話的なウィンドウのアプリケーション(前回の続き)
========================================================

それでは、HumanWindowのソース・コードの説明をしていきます。

----------------------------------------------
package jp.co.flsi.lecture.ui;

import java.awt.Button;
import java.awt.Frame;
import java.awt.Label;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import jp.co.flsi.lecture.human.Human;

public class HumanWindow extends Frame { // 1)
   private HumanEventListener eventListener = new HumanEventListener();
   private HumanActionListener actionListener = new HumanActionListener();
   private Label labelDateOfBirth = new Label();
   private Label labelYear = new Label();
   private Label labelMonth = new Label();
   private Label labelDay = new Label();
   private Label labelName = new Label();
   private Label labelResponse = new Label();
   private Button instanceButton = new Button();
   private TextField textFieldYear = new TextField();
   private TextField textFieldMonth = new TextField();
   private TextField textFieldDay = new TextField();
   private TextField textFieldName = new TextField();

   class HumanEventListener implements WindowListener { // 2)
      public void windowActivated(WindowEvent e) {};
      public void windowClosed(WindowEvent e) {
         System.exit(0);
      };
      public void windowClosing(WindowEvent e) {
         Frame frame = (Frame)e.getSource();
         frame.setVisible(false);
         frame.dispose();
      };
      public void windowDeactivated(WindowEvent e) {};
      public void windowDeiconified(WindowEvent e) {};
      public void windowIconified(WindowEvent e) {};
      public void windowOpened(WindowEvent e) {};
   };

   class HumanActionListener implements ActionListener { // 3)
      public void actionPerformed(ActionEvent e) { // 4)
         Button button = (Button)e.getSource(); // 5)
         HumanWindow window = (HumanWindow)button.getParent(); // 6)
         int year = Integer.parseInt(window.getTextFieldYear().getText()); //7)
         int month = Integer.parseInt(window.getTextFieldMonth().getText());
         int day = Integer.parseInt(window.getTextFieldDay().getText());
         Human human = new Human(year, month, day); // 8)
         human.setName(window.getTextFieldName().getText()); // 9)
         window.getLabelResponse().setText(
         "私は" + human.getName() + "です。" + human.getAge() + "歳です。"); //10)
      };
   };

   public HumanWindow()  {  // 11)
      super();  // 12)
      setTitle("ヒュウマン劇場");  // 13)
      setSize(400, 150); // 14
      setLayout(null);  // 15)
      labelDateOfBirth.setBounds(10, 30, 200, 20);  // 16)
      getTextFieldYear().setBounds(210, 30, 40, 20);  // 17)
      labelYear.setBounds(255, 30, 20, 20);  // 18)
      getTextFieldMonth().setBounds(290, 30, 20, 20);  // 19)
      labelMonth.setBounds(315, 30, 20, 20);  // 20)
      getTextFieldDay().setBounds(350, 30, 20, 20);  // 21)
      labelDay.setBounds(375, 30, 20, 20);  // 22)
      labelName.setBounds(10, 60, 60, 20);  // 23)
      getTextFieldName().setBounds(70, 60, 320, 20);  // 24)
      instanceButton.setBounds(120,90, 160, 20);  // 25)
      getLabelResponse().setBounds(10, 120, 380, 20);  // 26)
      add(labelDateOfBirth);  // 27)
      add(getTextFieldYear());  // 28)
      add(labelYear);  // 29)
      add(getTextFieldMonth());  // 30)
      add(labelMonth);  // 31)
      add(getTextFieldDay());  // 32)
      add(labelDay);  // 33)
      add(labelName);  // 34)
      add(getTextFieldName());  // 35)
      add(instanceButton);  // 36)
      add(getLabelResponse());  // 37)
      labelDateOfBirth.setText("生成するヒュウマンの生年月日:");  // 38)
      labelYear.setText("年");  // 39)
      labelMonth.setText("月");  // 40)
      labelDay.setText("日");  // 41)
      labelName.setText("氏名:");  // 42)
      instanceButton.setLabel("インスタンスの生成");  // 43)
      instanceButton.addActionListener(actionListener);  // 44)
      addWindowListener(eventListener);  // 45)
      setVisible(true);  // 46)
   }

   public TextField getTextFieldYear() {  // 47)
      return textFieldYear;  // 48)
   }

   public TextField getTextFieldMonth() {  // 49)
      return textFieldMonth;  // 50)
   }

   public TextField getTextFieldDay() {  // 51)
      return textFieldDay;  // 52)
   }

   public TextField getTextFieldName() {  // 53)
      return textFieldName;  // 54)
   }

   public Label getLabelResponse() {  // 55)
      return labelResponse;  // 56)
   }

   public static void main(String[] args) {  // 57)
      HumanWindow frame = new HumanWindow();  // 58)
   }

}
----------------------------------------------

最初のpackage文やimport文については、もう説明不要ですね。

1)のclass文についても、もう説明しなくてもわかると思いますが、
先日のHumanFrameの代わりにここではHumanWindowというクラスを
Frameのサブクラスとして定義しています。

1)の下の2行

private HumanEventListener eventListener = new HumanEventListener();
private HumanActionListener actionListener = new HumanActionListener();

ももうおわかりだと思いますが、イベント・リスナーのインスタンスを生成しています。
HumanEventListenerのほうは、HumanFrameのときに定義したものと同じものです。
一方、HumanActionListenerのほうは、ボタン(Button)専用のイベント・リスナー
としてこのHumanWindowで新たに用意したものです。実際のHumanActionListener
クラスの定義は、3)以降にあります。

その下の

private Label labelDateOfBirth = new Label();   
private Label labelYear = new Label();   
private Label labelMonth = new Label();   
private Label labelDay = new Label();   
private Label labelName = new Label();   
private Label labelResponse = new Label();   
private Button instanceButton = new Button();   
private TextField textFieldYear = new TextField();   
private TextField textFieldMonth = new TextField();   
private TextField textFieldDay = new TextField();   
private TextField textFieldName = new TextField();

はHumanWindowのフレーム・ウインドウに貼り付けるGUI部品です。
LabelはHumanFrameのときにも出てきました。ここでは、labelDateOfBirth、
labelYear、labelMonth、labelDay、labelNameという変数名で、それぞれ
生年月日、年、月、日、氏名の文字を表示するために用意しています。

(このように変数名やメソッド名には、わかりやすい名前をつけることがとても
重要で、たとえば、label01, label02なんていう名前をつけたのでは何のための
変数かわかりづらくて、プログラミングの生産性を落としたり間違いをおかしやす
くする原因になります。)

また、labelResponseはHumanのインスタンスが氏名や年齢の情報を答えてきた
ときに、それを表示するためのものです。あとでまた説明します。
Buttonは文字通りボタンを表すGUI部品です。このボタンを押すとHumanのインス
タンスが生成され、そのインスタンスが氏名と年齢を答えるようにします。
TextFieldのインスタンスが4つ(textFieldYear、textFieldMonth、
textFieldDay、textFieldName)生成されていますが、これらはそれぞれ
生年月日の年、月、日と氏名を入力するためのものです。

なお、これらのイベント・リスナーやGUI部品はそれぞれインスタンスが生成されて
いますが、これらのインスタンスはあくまでHumanWindowというオブジェクトの中
にあることに注目してください。
すなわち、HumanWindowはこれらのイベント・リスナーやGUI部品のオブジェクトを
内部に持つ、いわゆる「複数オブジェクト」の構造をしているのです。

2)以降はHumanEventListenerの定義(inner classになっている)がありますが、
これはHumanFrameのときとまったく同じものです。

3)以降

----------------------------------------------
class HumanActionListener implements ActionListener { // 3)
   public void actionPerformed(ActionEvent e) { // 4)
      Button button = (Button)e.getSource(); // 5)
      HumanWindow window = (HumanWindow)button.getParent(); // 6)
      int year = Integer.parseInt(window.getTextFieldYear().getText()); //7)
      int month = Integer.parseInt(window.getTextFieldMonth().getText());
      int day = Integer.parseInt(window.getTextFieldDay().getText());
      Human human = new Human(year, month, day); // 8)
      human.setName(window.getTextFieldName().getText()); // 9)
      window.getLabelResponse().setText(
      "私は" + human.getName() + "です。" + human.getAge() + "歳です。"); //10)
   };
};
----------------------------------------------

は、HumanActionListenerの定義(これもinner classになっている)です。
3)は、HumanActionListenerがActionListenerを実装(implement)して
いることを意味します。

このActionListenerというのもやはりインターフェイスで、イベント・リスナー
(EventListener)の一種です。ActionListenerはactionPerformed( )と
いうメソッドしか持っておらず、ボタンのクリックのイベントだけを拾わせたいとき
などは、このactionPerformed( )メソッドだけを実装すれば済むので、簡単で
便利です。

このactionPerformed( )メソッドは、4)のように、ActionEvent型の引数を
取りますが、ActionEventは、発生したイベントの情報を持つオブジェクトです。

そのメソッドである5)のgetSource()は、イベントの発生元を答えてくれるメソッ
ドです。

public Object getSource()

という形式でActionEventのスーパークラスが持っているメソッドです。
つまり、このメソッドの戻り値はObjectです。

┌補足─────────────────────────┐
ObjectというのはJavaの世界におけるあらゆるクラスのスーパー
クラスです。
つまり、Javaにおけるあらゆるオブジェクトはスーパークラスを
たどっていくと、最終的にはObjectにたどりつくようになっています。

また、クラス定義のときにスーパークラスを指定しないときは、自動的
にObjectのサブクラスとなります。

たとえば、先日Humanというクラスを定義したときにクラス文の中では
スーパークラスを指定しませんでしたが、この場合は自動的にスーパー
クラスがObjectになっています。

つまり、Humanは、特に明示しなくてもObjectの持つ属性やメソッド
をそのまま受け継いでいるし、HumanはObjectの一種として扱われる
のです。
└───────────────────────────┘

そうすると、このgetSource( )メソッドの戻り値として返ってきたイベント
の発生元は、そのままではObject型として扱われてしまいます。

ところが、このActionListenerのインスタンスは、ボタンにつないで使う
(ソース・コードの44)参照)ことにしているので、そのイベントの発生元が
Buttonのインスタンスであることはあらかじめわかっています。

したがって、5)のように(Button)というキャストによってButton型に変換
させるのです。

そして、Button型の変数であるbuttonという変数に代入しています。

そうすると、以後、このbuttonという変数を通してアクセスするオブジェクト
はButton型のオブジェクトとして扱われ、Buttonの持つメソッドを呼び出すこと
ができます。

┌補足─────────────────────────┐
sourceは源という意味でしたね。getSource( )というメソッド名は
「(イベントの)源を取り出す」という意味から来ています。しかし、
イベントの発生源のオブジェクトそのものを取り出すわけではありません。
あくまで、そのオブジェクトのアドレスを取り出して戻り値として返して
くるのです。

ところで、戻り値の型がObjectだと、そのアドレスを通してオブジェクト
にメッセージを送っても、Objectのメソッドしか呼び出すことはできませ
ん。
Buttonのオブジェクトとして認識できるようにするためには、Buttonに
型変換しておく必要があるのです。
└───────────────────────────┘

6)では、このButtonオブジェクトのgetParent( )メソッドを呼び出すことによって、
このボタンの親(parent)を答えてもらい、それをwindowというHumanWindow型
の変数に代入しています。

┌補足─────────────────────────┐
通常のウインドウのお腹の中にはボタン(Button)やテキスト・フィールド
(TextField)やラベル(Label)などのGUI部品が入っています(というより、
GUI部品がウインドウのお腹の上に貼りついているという表現のほうが
わかりやすいと思う)が、この場合、ウインドウをGUI部品の「親」(parent)
ということがあります。また、ウインドウに貼りついているGUI部品をウイ
ンドウの「子」(child)ということがあります。
└───────────────────────────┘

getParent( )メソッドの戻り値はContainer型です。Containerは
ウインドウのようにお腹にGUI部品を貼り付けられるオブジェクトのスーパー
クラスです。(英語のContainerという単語は入れ物という意味ですね。)

ところが、このボタンはHumanWindowの中に組み込んで使うことにしている
ので、ボタンの親がHumanWindowであることはあらかじめわかっているので
す。
それでgetParent( )メソッドの戻り値に(HumanWindow)というキャストを
かけて、HumanWindowに型変換し、windowというHumanWindow型の変数に
代入しているのです。

こうして、4)の引数eを通して5)によって、その発生元であるボタンを把握し、
さらに6)によってボタンが貼りついているウインドウを把握したわけですが、
このウインドウを通して7)以下

----------------------------------------------
int year = Integer.parseInt(window.getTextFieldYear().getText()); //7)
int month = Integer.parseInt(window.getTextFieldMonth().getText());
int day = Integer.parseInt(window.getTextFieldDay().getText());
----------------------------------------------

でテキスト・フィールドに入力されている各データを読み取っています。

7)を見てみましょう。その中の

window.getTextFieldYear()

は、47)で定義されているgetメソッドを使ってtextFieldYearのオブ
ジェクトを取り出しています。そして、そのオブジェクトに対して7)では

window.getTextFieldYear().getText()

というようにgetText()メソッドを呼び出しています。

一つの文の中に.が複数あるときは、(括弧などで囲まれていない限り)
左側から順に処理されていくことになっており、このようにtextFieldYearの
オブジェクトが取り出されてから、そのオブジェクトのgetText()メソッドが
呼び出されるという順番に処理されていくのです。

(なお、getText()はTextFieldのスーパークラスのメソッドです。)

なお、括弧がある場合は括弧の中が先に処理され、括弧が何重にもなっている
ときは一番内側の括弧の中が一番先に処理されます。

このgetText()メソッドはテキスト・フィールド(TextField)に入力され
ている文字列を取り出すメソッドです。

7)ではさらに、こうして取り出した文字列をIntegerクラスのparseInt()
というメソッドに処理させています。

このparseInt()というのはIntegerクラスのstaticメソッドで、引数と
して与えられた文字列をint型の数に変換してくれます。
このメソッドの戻り値はint型になりますので、それをさらにint型のyearと
いう変数に代入しています。

┌補足─────────────────────────┐
画面上のテキスト・フィールドに数字を入力すると、それは数ではなく、
あくまで文字として認識されます。したがって、数として扱いたいときは、
文字から数にいちいち変換してやらなければならないのです。
コンピューターは人間と違って融通がききませんから、このようにいろいろ
と面倒臭いことがあります。
└───────────────────────────┘

7)の下の2行は7)と同じパターンなので説明を省きます。

次の
 
----------------------------------------------
Human human = new Human(year, month, day); // 8)
----------------------------------------------

ではこれらの変数をHumanのコンストラクターの引数にして、Humanのインス
タンスを生成しています。これらの引数は、Humanのインスタンスの生年月日
として与えられるものでしたね。

次の

----------------------------------------------
human.setName(window.getTextFieldName().getText()); // 9)
----------------------------------------------

のwindow.getTextFieldName().getText()の部分はもうおわかりですね。
これは、テキスト・フィールドtextFieldNameに入力された文字列を取り出し
ていますが、9)ではそれを引数としてHumanのインスタンスのsetName( )メ
ソッドを呼び出しています。
つまり、textFieldNameに入力された文字列をHumanのインスタンスの氏名
としてセットしているわけです。

----------------------------------------------
window.getLabelResponse().setText(
"私は" + human.getName() + "です。" + human.getAge() + "歳です。"); //10)
----------------------------------------------

のhuman.getName()とhuman.getAge()は、それぞれhumanの氏名と年齢を
取り出すメソッドでしたね。
たとえば、氏名が山田花子で26歳だとしたら、

"私は" + human.getName() + "です。" + human.getAge() + "歳です。"

は、

"私は山田花子です。26歳です。"

になります。

そして、window.getLabelResponse()がウインドウに貼りついている
ラベルlabelResponseを取り出すので、10)はそのラベルのsetText()メソッド
を呼び出して「私は山田花子です。26歳です。」という文字列を記憶させることに
なります。
(setText()メソッドは文字列を記憶するとともにその文字列を画面上に表示します。)

次の11)〜46)

----------------------------------------------
public HumanWindow()  {  // 11)
   super();  // 12)
   setTitle("ヒュウマン劇場");  // 13)
   setSize(400, 150); // 14)
   setLayout(null);  // 15)
   labelDateOfBirth.setBounds(10, 30, 200, 20);  // 16)
   getTextFieldYear().setBounds(210, 30, 40, 20);  // 17)
   labelYear.setBounds(255, 30, 20, 20);  // 18)
   getTextFieldMonth().setBounds(290, 30, 20, 20);  // 19)
   labelMonth.setBounds(315, 30, 20, 20);  // 20)
   getTextFieldDay().setBounds(350, 30, 20, 20);  // 21)
   labelDay.setBounds(375, 30, 20, 20);  // 22)
   labelName.setBounds(10, 60, 60, 20);  // 23)
   getTextFieldName().setBounds(70, 60, 320, 20);  // 24)
   instanceButton.setBounds(120,90, 160, 20);  // 25)
   getLabelResponse().setBounds(10, 120, 380, 20);  // 26)
   add(labelDateOfBirth);  // 27)
   add(getTextFieldYear());  // 28)
   add(labelYear);  // 29)
   add(getTextFieldMonth());  // 30)
   add(labelMonth);  // 31)
   add(getTextFieldDay());  // 32)
   add(labelDay);  // 33)
   add(labelName);  // 34)
   add(getTextFieldName());  // 35)
   add(instanceButton);  // 36)
   add(getLabelResponse());  // 37)
   labelDateOfBirth.setText("生成するヒュウマンの生年月日:");  // 38)
   labelYear.setText("年");  // 39)
   labelMonth.setText("月");  // 40)
   labelDay.setText("日");  // 41)
   labelName.setText("氏名:");  // 42)
   instanceButton.setLabel("インスタンスの生成");  // 43)
   instanceButton.addActionListener(actionListener);  // 44)
   addWindowListener(eventListener);  // 45)
   setVisible(true);  // 46)
}
----------------------------------------------

は、HumanWindowのコンストラクターの定義になります。

12)〜14)はHumanFrameのときに登場したものと同様ですからおわかりだと思います。
12)は、スーパークラスのコンストラクターを呼び出すことを意味します。
13)は、タイトル・バーに「ヒュウマン劇場」という文字列を表示するようにします。
14)は、ウインドウの大きさを横400ピクセル、縦150ピクセルにしています。

次に

   setLayout(null);  // 15)

は、レイアウト・マネジャーを「無し」にすることを意味します。

  labelDateOfBirth.setBounds(10, 30, 200, 20);  // 16)

は、ラベルlabelDateOfBirthの位置と大きさを設定するものです。ウインドウ内
のx座標が10、y座標が30の位置に置き、横幅は200で縦が20の大きさにすることを
意味します。

ここでx座標は横方向の位置で、y座標は縦方向の位置を意味しますが、ウインドウの
世界では左上が基準点になっており、数学のy座標と違ってウインドウの左上を原点
とし、下に行くほどy座標の数字が増えるようになっていますので、ご注意ください。
なお、数字の単位はすべてピクセルです。

レイアウト・マネジャーが無い場合は、このように個々のGUI部品ごとに位置やサイ
ズを指定してやります。

  getTextFieldYear().setBounds(210, 30, 40, 20);  // 17)

は、テキスト・フィールドtextFieldYearの位置と大きさを設定するものです。
ウインドウ内のx座標が210、y座標が30の位置に置き、横幅は40で縦が20の大きさ
にすることを意味します。

getTextFieldYear()はtextFieldYearを取り出すためのgetメソッドで、
47)、48)で定義されているものです。getメソッドの代わりにtextFieldYearを
直接指定しても同じことですが、getメソッドが定義されている場合は、getメソッ
ドを使うのが原則です。

一方、16)はlabelDateOfBirthに対するgetメソッドが定義されていないので変数名
をそのまま使っています。

以下17)から26)まで同じパターンなので、もうおわかりでしょう。説明を省略します。

  add(labelDateOfBirth);  // 27)

はこのウインドウにラベルlabelDateOfBirthを貼り付けることを意味します。

今までのところで、このラベルのオブジェクトの生成と位置やサイズの設定は
行ってきたのですが、ウインドウのお腹に貼り付けるという作業はまだやって
いなかったのですね。27)でそれを行ったわけです。

 add(getTextFieldYear());  // 28)

は、同様にテキスト・フィールドtextFieldYearをウインドウに貼り付けています。

以下、29)から37)まで同様です。

labelDateOfBirth.setText("生成するヒュウマンの生年月日:");  // 38)

は、ラベルlabelDateOfBirthに「生成するヒュウマンの生年月日:」という
文字列を設定しています。

以下同様に39)から42)でそれぞれラベルに「年」、「月」、「日」、「氏名」
という文字列を設定しています。

次に

 instanceButton.setLabel("インスタンスの生成");  // 43)

は、ボタンinstanceButtonのラベルに「インスタンスの生成」という文字列を
設定しています。
これで、ボタンに「インスタンスの生成」という文字列が書かれることになります。

次に

   instanceButton.addActionListener(actionListener);  // 44)

は、ボタンにactionListenerをつないでいます。addActionListener( )と
いうメソッド名は文字通り訳すと「アクション・リスナーを追加する」という意味
になりますが、ボタンにアクション・リスナー(ActionListener)を糸電話か
電話線でつないでいるようなイメージを浮かべていただければわかりやすいと思います。

こうしておくと、ボタンがクリックされたときに、そのイベント(事象)をボタンが
アクション・リスナーに通知してくれます。
この「アクション・リスナーを追加する」という作業を行っておかないとボタンから
アクション・リスナーへのつながりがなく、イベントは通知されません。

   addWindowListener(eventListener);  // 45)

は、HumanFrameのときに出てきたものと同じですね。44)とも同様の操作ですが、
44)がボタンに対して行っている操作である(メソッド呼び出しの前にinstanceButton
というオブジェクトの指名がある)のに対し、45)ではHumanWindowのウインドウ自身に
対して行っている操作(メソッド呼び出しの前にオブジェクトの指名がない、もし指名し
たいならthisを指定する)です。

   setVisible(true);  // 46)

は、HumanFrameのときにも出てきました。こうして、ウインドウ上のさまざまな
設定作業をしたあと、最後にウインドウ全体を目に見える状態にするわけです。

以上で、このコンストラクターが行っている作業は終わりです。

次に47)から56)ですが、これらは各GUI部品のgetメソッドの定義です。

----------------------------------------------
   public TextField getTextFieldYear() {  // 47)
      return textFieldYear;  // 48)
   }

   public TextField getTextFieldMonth() {  // 49)
      return textFieldMonth;  // 50)
   }

   public TextField getTextFieldDay() {  // 51)
      return textFieldDay;  // 52)
   }

   public TextField getTextFieldName() {  // 53)
      return textFieldName;  // 54)
   }

   public Label getLabelResponse() {  // 55)
      return labelResponse;  // 56)
   }
----------------------------------------------

getメソッドがなんであるかを忘れた人は以前の記事を復習してください。

最後に

----------------------------------------------
   public static void main(String[] args) {  // 57)
      HumanWindow frame = new HumanWindow();  // 58)
   }
----------------------------------------------

はmain( )メソッドの定義ですが、ここでは58)でHumanWindowのインスタンス
を生成するだけというきわめて簡単なものになっています。


はい、ではこのHumanWindowのソース・コードをEclipseに入力してみましょう。
もう、Eclipseの使い方はだいたいわかってきたことと思いますので、説明は省略
します。

ただし、一つ注意しておくことがあります。

今回は日本語の文字列を含んでいるのですが、そのまま入力するとアプリケーション
の実行時に日本語の文字列が文字化けをおこしてしまいます。
これは、Eclipseのデフォルトの文字コード(エンコード)がUTF-8になっている
ためです。これがWindowsのデフォルトであるMS932と食い違うために文字化けを
起すのです。(文字コード(エンコード)とは何ぞや?については、もっと後で
詳しく説明いたします。)
これに対処するためには、次のようにしてEclipseのエンコードを変更しておきます。

(1) Eclipseのパッケージ・エクスプローラー内のJStudy1(プロジェクト)を右クリックし、
「プロパティー」を選択します。(あるいは、特定のクラスだけエンコードを変更したい
場合は、プロジェクトの代わりにそのクラスを右クリックし、「プロパティー」を選択
します。)

(2) 「JStudy1のプロパティー」ウインドウの中央付近にテキスト・ファイル・エンコード
という領域がありますが、この中の「その他」の項目を選択し、右側の逆三角形のマーク
のボタンをクリックして(さらにプルダウンリストの中でスクロールし)「MS932」を選択
し、「OK」ボタンをクリックします。


上記の操作が終わればソースコードを入力していってだいじょうぶですが、入力時
には以下のことにも注意して下さい。

日本語の漢字やひらがなは全角ですが、他はすべて半角(直接入力)での入力に
なります。たとえば

 "私は" + human.getName() + "です。" + human.getAge() + "歳です。"

という部分を入力するときに、初心者の人は、半角と全角がごっちゃになってしまっ
て、たとえば"を全角で入力してしまう(半角で入力したつもりでも変換をして全角
にしてしまう)といったことがよくありますのでご注意ください。
"などの記号もやはり半角(直接入力)で入力します。

半角にすべきところを全角にしてしまうと、Eclipseがエラーを表示します。


入力が終わったら、保管して実行してみてください。

「ヒュウマン劇場」というウインドウが開いたら、自分の生年月日と氏名を入力
して試してみてください(ただし、年は西暦で入れます)。「インスタンスの生成」
ボタンをクリックすると、その下に「私はxxxxです。xx歳です。」という表示が
出ますね。
HumanWindowのオブジェクトの中で自分の生年月日と氏名を持つHumanのインス
タンスが生成されて、そのインスタンスが答えた氏名と年齢が「私はxxxxです。xx歳です。」
の文に組み込まれて表示されたわけです。

ついでに、家族や友達やペットの生年月日と氏名も入力して試してみましょう。
正しい年齢が返ってきますか。


さて、生年月日を西暦で覚えていない人も結構いることと思います。和暦で入力すれば済む
ようにしたいですね。

今回も長くなったので、ここでいったん話を切りますが、次回は和暦を西暦に変換するクラ
スを作ってHumanWindowを改良してみましょう。



================================================
◆ 02.演習問題
================================================

上の「私はxxxxです。xx歳です。」が表示されるラベルの変数は何という変数名でしょうか。



======================================================
◆ 03.前回の演習問題の答
======================================================

前回の段階でEclipseに入力したら、アプリケーションの実行時に文字化けを起していた
ことと思いますが、今回の説明を読めば皆できたことと思います。

漠然と記事を読んでその通りに入力しただけではあまり印象に残らず、後で失敗を
してしまうということがありますが、このように、一度失敗してから記事を読んで
対処できれば、対処法が印象に残って以後失敗しにくくなりますね。

もしうまくできなかった人は、下記ホームページにて質問をお寄せください。



◆編集後記◆━━━━━━━━━━━━━━━━━━━━━━━━

☆最後まで読んでくださってありがとうございます。

☆今までは実用性のない単純なプログラムを作って来ましたが、今後は実際に使える
アプリケーションも作っていきます。
お楽しみに。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━



┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
★ホームページ:
      http://www.flsi.co.jp/Java_text/
★このメールマガジンは
     「まぐまぐ(http://www.mag2.com)」
 を利用して発行しています。
★バックナンバーは
      http://www.flsi.co.jp/Java_text/
 にあります。
★このメールマガジンの登録/解除は下記Webページでできます。
      http://www.mag2.com/m/0000193915.html
★このメールマガジンへの質問は下記Webページにて受け付けて
 います。わからない所がありましたら、どしどしと質問をお寄
 せください。
      http://www.flsi.co.jp/Java_text/
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

Copyright (C) 2010 Future Lifestyle Inc. 不許無断複製