SetDaysFrame.handleEvent()メインのメソッドhandleEvent()を見ましょう。していることは
case (ボタンが押された):
if (OKButtonならば) {
//設定された月が適切か判断して日付を設定し、フレームを閉じる。
}
} else if (cancelButtonならば) {
//フレームを閉じる。
}
case (フレームを閉じる動作が行なわれた):
//フレームを閉じる。
です。では順番に説明していきます。
public boolean handleEvent(Event event) {
switch(event.id) {
case Event.ACTION_EVENT:
handleEvent()は汎用イベント処理メソッドなので、まず生じたイベントのevent.idを用いて場合分けを行います。ここで処理したい、ボタンが押されたイベントはACTION_EVENTなので、それを捕まえています。
if (event.target == OKButton) {
そしてこの条件式でACTION_EVENTのうちOKButtonが押された場合を捕まえます。OKButtonが押されたらまず
try {
int birthdayYear = Integer.parseInt(birthdayYearField.getText());
int birthdayMonth = Integer.parseInt(birthdayMonthField.getText());
int birthdayDate = Integer.parseInt(birthdayDateField.getText());
int calcYear = Integer.parseInt(calcYearField.getText());
int calcMonth = Integer.parseInt(calcMonthField.getText());
int calcDate = Integer.parseInt(calcDateField.getText());
で、テキストフィールドに設定された数字を変数に代入します。Integer.parseInt()でNumberFormatExceptionが発生する可能性があるのでtry節にしてます。
APIドキュメントを見るとjava.awt.TextField.getText()がないので「こういうメソッドないんだろうか?」と一瞬疑問に思いましたが、ちゃんと親クラスのjava.awt.TextComponentに定義されていました。
さて、日付が取得できたら、まず
if (birthdayMonth >= 1 && birthdayMonth <= 12 && calcMonth >=1 && calcMonth <= 12) {
で月が正しい範囲内にあるか調べます。年や日は正しい範囲になくても何とか動作しますが、月が正しい範囲にないとCalcDateクラスで処理するときにArrayIndexOutOfBoundsExceptionが発生してしまうので、月だけをチェックしています。チェックを通り抜けたら
yourBiorhythm.setBirthday(birthdayYear, birthdayMonth, birthdayDate); yourBiorhythm.setCalculateDay(calcYear, calcMonth, calcDate);
で値をセットします。月が正しい範囲にないときは無視することにしました。もっとチェックを厳しくしてエラーダイアログをあげるようにしても良いかもしれません。
} catch (NumberFormatException ex) {
} finally {
biorhythmCanvas.repaint();
this.dispose();
}
return true;
さてNumberFormatExceptionが生じた場合はTextFieldに数字以外が設定されているので無視することとしcatch節では何もしません。値が設定されたにしろ無視されたにしろ最後はfinally節でbiorhythmCanvas.repaint()でバイオリズムを描画しthis.dispose()でフレームを閉じます。そして、このイベントを上位の階層で処理させないためにreturn trueとします。
ACTION_EVENTの処理はまだ続き
} else if (event.target == cancelButton) {
でcancelButtonが押された場合を捕まえます。cancelButtonが押された場合は何もせずに
this.dispose(); return true;
this.dispose()でフレームを閉じて、return trueしておきます。
さてhandleEvent()で処理するもう一つのケースは「フレームを閉じる動作が行なわれた」です。フレームのクローズボックスが押された場合などがこのケースです。まず
case Event.WINDOW_DESTROY:
で、このケースを捕まえて
this.dispose(); return true;
フレームを閉じて上位の階層に処理させないようにします。
ボタンが押されたときの処理だけをすれば良いのならhandleEvent()ではなくaction()イベントを用いたのですが、フレームを閉じる動作はhandleEvent()でなくては捕まえられないので、ボタンを押す動作もまとめて面倒みることにしたというのが実際です。
このメソッドの最後の行で
return false;
として、処理しなかったイベントを上位の階層で処理させるようにしています。