広告

■□■□■□■□■□■□■□■□■□■□■□■□■□■□■
                      2011年11月05日

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

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


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


========================================================
◆ 01.データベースを使用するアプリケーションの開発(続き)
========================================================

では、今回は、社員番号に何も入力されなかった場合や、数字
以外の文字が入力された場合など、入力エラーがあったときに、
MessageDialogを開いてエラーのメッセージを表示するようにし
ましょう。

テキスト・フィールド(JTextField)に入力されたデータが数値
でない場合は、Integer.parseInt()メソッドでint型に変換するとき
にNumberFormatExceptionという例外を発生するので、それを検出
することによって発見できます。
テキスト・フィールドに何も入力されなかった場合も同じ例外
を検出することによって発見できます。

では、HumanResourceEntryPaneのgetButton()メソッドの中の

--------------------------------------------------------
anEmployee.setEmployeeNumber(Integer.parseInt(getJTextField().getText()));
--------------------------------------------------------

の行を修正して

--------------------------------------------------------
int empNumber;
try {
  empNumber = Integer.parseInt(getJTextField().getText());
}
catch (NumberFormatException e1) {
  getMessageDialog().getTextPane().setText("エラー:社員番号の入力値が数字になっていません。");
  getMessageDialog().setVisible(true);
  return;
}
anEmployee.setEmployeeNumber(empNumber);
--------------------------------------------------------

に書き換えましょう。
なお、上記の中で出てくるreturn文には戻り値が書かれていません
ね。
このように戻り値を書かないreturn文は、戻り値の型がvoidになっ
ているメソッドにおいて、戻り値なしで処理だけ終了することを意
味します。
つまり、上記でreturn;と書いてあるのは、actionPerformed()メソッ
ドの処理をここで打ち切ってしまうという意味で、戻り値が指定され
ていないのはactionPerformed()メソッドの型がvoidに指定されてい
るからです。

これで、社員番号に数字以外の文字列を入力したり、もしくは空の
ままにすると、MessageDialogを開いて「エラー:社員番号の入力値
が数字になっていません。」というメッセージを表示することになり
ます。

はい、では、修正したソース・コードを保管して動作をテストしてみ
てください。



数字を入力しなければならないテキスト・フィールドは社員番号以外
にもありますね。
生年月日の年と月と日がそうです。
ここの入力値が数字以外の文字列だった場合にも同様にMessageDialog
を開いてエラー・メッセージを表示するようにすべきですが、さっきと
同様ですから説明は省略させていただきます。

なお、たとえば2月31日などの実在しない年月日を入力したときにもエ
ラー・メッセージを表示するようにすべきですが、これも説明を省略
させていただきます。

ここらへんのエラー・メッセージの表示は演習問題として自力でやっ
てみてください。
どうしてもやり方がわからない人は当メールの最後のほうに書かれて
いるWebページにて質問をお送りください。


ところで、このMessageDialogにJTextPaneを貼り付けたときに、
JTextPaneを使う理由として、長い文字列を複数行に表示できること
をあげました。
しかし、複数行に表示するだけであればJTextAreaというクラスを使っ
てもできます。

しかしながら、JTextPaneはJTextAreaよりもずっと高機能で、文字の
飾り付けなども自由自在に行うことができます。

では、エラーだということがはっきりとわかるように、メッセージに
飾り付けをして強調してみましょう。

やり方はいろいろとありますが、ここでは、HTMLを使ってメッセージ
を記述する方法をとってみます。

HTMLというのはWebページ(ホームページ)の文書(文書といっても文字
だけでなく、画像その他さまざまなものを貼り付けられる)を記述する
ための言語です。


まず、MessageDialogのエディターのDesignビュー上で、張り付いてい
るJTextPaneをクリックし、Properties欄のcontentTypeプロパティー
を選択して、(現在の値は「text/plain」になっているはずですが)
その値を「text/html」に変更してください。

これで、このJTextPaneにセットされる文字列がHTML言語で書かれた
ものと見なされるようになります。

次に、先ほど修正したHumanResourceEntryPaneのgetButton()メソッ
ドの中の

--------------------------------------------------------
getMessageDialog().getTextPane().setText("エラー:社員番号の入力値が数字になっていません。");
--------------------------------------------------------

の行を下記のように書き換えましょう。

--------------------------------------------------------
String errorHtml = "<HTML>"
           + "<HEAD><TITLE>エラー・メッセージ</TITLE></HEAD>"
           + "<BODY>"
           + "<FONT color=\"FF0000\" size=\"+1\">エラー:</FONT><BR>"
           + "<FONT color=\"0000FF\">社員番号</FONT>の入力値が数字になっていません。"
           + "</BODY>"
           + "</HTML>";
getMessageDialog().getTextPane().setText(errorHtml);
--------------------------------------------------------

ここでerrorHtmlというString型の変数に代入した文字列はHTML言語
の形式になっています。
HTML言語については後に詳しく説明しますので、ここではごく簡単に
説明するだけにします。


まず、<と>で囲まれた部分は制御用の文字列です。

そして、<BODY>と</BODY>の間に記述した部分がJTextPane上に表示さ
れる部分で、<FONT .....>は</FONT>との間にはさまれた文字列に対し
て何らかのフォントの設定を行うものです。

ここで「color="FF0000" size="+1"」としてあるのは、「エラー:」と
いう文字列に対して色(color)をRGBで赤色に指定し、フォントのサイ
ズ(size)を+1すなわち通常のサイズより1段階大きいサイズに指定す
ることを意味します。
(なお、上記のソース・コードではcolor="FF0000"ではなくcolor=\"FF0000\"
となっていますが、ここの「\"」という記述は(016号で説明した)二重
引用符(")を意味するエスケープ・シーケンスです。
このように、文字列のリテラルを囲むための二重引用符(")と区別す
るために、文字列の値としての二重引用符はエスケープ・シーケンスを
使って記述します。)

RGBについては029号や030号で説明しましたが、上記のcolor="FF0000"の
指定では各赤(Red)緑(Green)青(Blue)の数値を16進数で表現しています。
最初のFFは赤の数値を255に指定しているものです(16進数での数値表現に
ついては下記補足を参照してください)。次の00は緑(Green)の数値を0に
指定しているもので、最後の00は青(Blue)の数値を0に指定しているもの
です。
したがって、FF0000というのはディスプレイ上で赤色だけが最大限に光っ
ている状態ですから、真っ赤になります。

同様に「color="0000FF"」としてあるのは、「社員番号」という文字列に
対して色(color)をRGBで0000FFすなわち青色に指定しているわけです。

┌補足─────────────────────────┐
我々が日ごろ使用している数値は10進数という形式で表現されて
いるのに対し、コンピューターの中では2進数が使われていること
は既にご存知のことと思います。
しかし、2進数はすべての数値を0と1だけを使って表現するため、
人が読むにはわかりにくいし、桁数が多すぎて読みづらいなどの
欠点があります。
そこでもう少し10進数に近い数値表現として多用されるのが16進数
です。
10進数が1桁の表現に10種類の文字(0,1,2,3,4,5,6,7,8,9)を使い、
10で桁上がりする数値表現なのに対し、16進数では1桁の表現に
16種類の文字を使い、16で桁上がりします。
10進数と16進数と2進数の数値表現を並べてリストすると下記のよう
になります。

10進数 16進数 2進数
------ ------ ------
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 .
 .
 .
255
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
10
11
12
      .
      .
      .
FF
0
1
10
11
100
101
110
111
1000
1001
1010
1011
1100
1101
1110
1111
10000
10001
10010
      .
      .
      .
11111111

これらの各進数の間の変換は、Windowsに付属している電卓で行う
ことができますので、確認してみてください。
以下、操作手順を書いておきます。
(1)「スタート」ボタン→「すべてのプログラム」→「アクセサリ」
 →「電卓」を選択します。
(2)「電卓」ウインドウのメニュー・バーから「表示」→「関数電卓」
 を選択します。(なお、Windows7版の場合は「関数電卓」ではなく
 「プログラマ」を選択します。)
(3) 16進,10進,8進,2進のうち入力したい進数表現を選択します。
(4) その進数表現で数値を入力します。(たとえば、2進数で255を
 入力したいときは11111111と入力する。)
(5) 16進,10進,8進,2進のうち出力したい進数表現を選択すると
 その進数に変換されます。
└───────────────────────────┘


なお、このHTML形式を使う方法だと、エラー・メッセージを外部の
HTMLファイルとして保管しておいて実行時にそれを読み込むという
ことも可能で、そのほうがメッセージの保守は容易になります。


では、修正したソース・コードを保管して動作をテストしてみてく
ださい。
社員番号に何も入力しないか、あるいは数字以外の文字を入力した
場合に「登録」ボタンをクリックすると上記のメッセージが表示さ
れることを確認してください。



(続く)


では、また来週。



========================================================
◆ 02.文法解説 [演算子]
========================================================

[算術用の単項演算子]
算術用の単項演算子(unary operator)には以下のものがあり
ます。

演算子  機能
------ ---------------------------
++    オペランドに1を加える。
         (a++ は a += 1 と同じ)

--    オペランドから1を引く。
         (a-- は a -= 1 と同じ)

つまり、++はオペランドの値を1つ増大させる演算子で、
--はオペランドの値を1つ減少させる演算子です。

単項演算子はオペランドを一つだけ持つ演算子ですが、上記
の演算子は、オペランドの前に置くこともできるし、後に置く
こともできます。
そして前に置いた場合と後に置いた場合では、演算子の働きが
ちょっと違います。

オペランドの前に置いた場合、そのオペランドが増大/減少さ
れたあとで、増大/減少された値が式の中で使用されますが、
オペランドの後に置いた場合は、増大/減少される前のオペラ
ンドの値が式の中で使用されます。

たとえば、

----------------
a = ++b + c++;
----------------



----------------
b += 1;
a = b + c;
c += 1;
----------------

と同じ働きをします。


(続く)



================================================
◆ 03.演習問題
================================================

上記の演算子の振る舞いを確認するために、下記のようなプロ
グラムを作って実行してみてください。

--------------------------------------------------------
public class ArithmeticOperationTest6 {

  public static void main(String[] args) {
     int a1 = 12;
     int b1 = 34;
     int c1 = 56;
     a1 = ++b1 + c1++;
     System.out.println("[Example 1]");
     System.out.println("int a = 12;");
     System.out.println("int b = 34;");
     System.out.println("int c = 56;");
     System.out.println("a = ++b + c++;");
     System.out.println("Result:  a = " + a1);
     System.out.println("Result:  b = " + b1);
     System.out.println("Result:  c = " + c1);

     int a2 = 12;
     int b2 = 34;
     int c2 = 56;
     b2 += 1;
     a2 = b2 + c2;
     c2 += 1;
     System.out.println("-------------");
     System.out.println("int a = 12;");
     System.out.println("int b = 34;");
     System.out.println("int c = 56;");
     System.out.println("b += 1;");
     System.out.println("a = b + c;");
     System.out.println("c += 1;");
     System.out.println("Result:  a = " + a2);
     System.out.println("Result:  b = " + b2);
     System.out.println("Result:  c = " + c2);

     int a3 = 12;
     int b3 = 34;
     int c3 = 56;
     a3 = b3++ + c3++;
     System.out.println("\n[Example 2]");
     System.out.println("int a = 12;");
     System.out.println("int b = 34;");
     System.out.println("int c = 56;");
     System.out.println("a = b++ + c++;");
     System.out.println("Result:  a = " + a3);
     System.out.println("Result:  b = " + b3);
     System.out.println("Result:  c = " + c3);

     int a4 = 12;
     int b4 = 34;
     int c4 = 56;
     a4 = b4 + c4;
     b4 += 1;
     c4 += 1;
     System.out.println("-------------");
     System.out.println("int a = 12;");
     System.out.println("int b = 34;");
     System.out.println("int c = 56;");
     System.out.println("a = b + c;");
     System.out.println("b += 1;");
     System.out.println("c += 1;");
     System.out.println("Result:  a = " + a4);
     System.out.println("Result:  b = " + b4);
     System.out.println("Result:  c = " + c4);
  }
}
--------------------------------------------------------



(次回に続く。)


では、また来週。



┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
★ホームページ:
      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) 2011 Future Lifestyle Inc. 不許無断複製