ControlPanel.action()

------------------------------------

このクラスの根幹部分のメソッドaction()です。

大きな構造としては

if (バイオリズムを計算する日を1増やすボタンが押された) {
    (バイオリズムを計算する日を1増やす処理)
    return true;
} else if (バイオリズムを計算する日を1減らすボタンが押された) {
   (バイオリズムを計算する日を1増やす処理)
    return true;
} else if (バイオリズムを計算する日と誕生日を設定するボタンが押された) {
    (バイオリズムを計算する日と誕生日を設定する処理)
    return true;
}
return false;

となります。

クラスに含まれるGUI部品からアクション・イベントが生じたときに そのクラスのaction()メソッドが呼ばれます。イベントを処理してtrueを返すと、そのイベントは上位の階層では処理されません。falseを返すと上位の階層で処理されます。詳しくは市販の参考書をどうぞ。

ここでは処理した場合はtrueを、処理してない場合は(ここで考えていないアクション・イベントの場合は)falseを返しています。

------------------------------------

ここでは、どんなアクション・イベントがあがってきたか調べるために

public boolean action(Event e, Object o) {
    if (e.target == nextButton) {

とイベントをあげたインスタンスを直接調べていますが

public boolean action(Event e, Object o) {
    if (e.target instanceof Button) {
        if ("next".equals(o)) {

のように、イベントをあげたのがボタンかどうか調べてから、そのラベル名を調べても良いです。

ここでそうしていないのはちょっとした理由からです。その理由と言うのは「いずれボタンのラベルもユーザが自由に設定できるようにしたかった」です。

ラベルを自由に設定できるようにすると二つのボタンに同じ名前を付ける人が出てくるかもしれません(多分いないとは思いますが)。そのためラベルで判定するのをやめています。

------------------------------------

さて、本題に戻ってボタンが押されたときの処理をみていきましょう。まずは

if (e.target == nextButton) {

でひっかかる"Next"ボタンが押されたときの処理です。バイオリズムを計算する日を1増やします。

日付計算機であるcalculator

calculator.set(yourBiorhythm.getCalcYear(),
               yourBiorhythm.getCalcMonth(),
               yourBiorhythm.getCalcDate());

で現在のバイオリズムを計算する日をセットします。

続いて日付計算機を用いて

long pastDays = calculator.getPastDays();
calculator.setPastDays(pastDays + 1);

と1増やした日付を得ます。そして

yourBiorhythm.setCalculateDay(calculator.getYear(),
                              calculator.getMonth(),
                              calculator.getDate());

で、実際にバイオリズムを計算する日を1増やし

biorhythmCanvas.repaint();

と、その新しい日でbiorhythmCanvasを再描画させて終了です。

------------------------------------
} else if (e.target == prevButton) {

でひっかかる"Prev"ボタンが押されたときの処理も同様なので説明を省略します。

------------------------------------

最後に

} else if (e.target == setButton) {

でひっかかる"Set Days"ボタンを押したときの処理です。非常に簡単で

setDaysFrame.show();
setDaysFrame.repaint();

と設定をするsetDaysFrameを表示するだけです。あとの処理はsetDaysFrameに任せています。

2行目のsetDaysFrame.repaint()はなくても良いと思うんですが、これをしないとMacintoshのNetscape3.01日本語版ではsetDaysFrameに何も表示されなかったので付けてます。

------------------------------------

前の項目へ次の項目へ

「メイキング・オブ・バイオリズム」のページへ