広告

■□■□■□■□■□■□■□■□■□■□■□■□■□■□■
                      2010年01月27日

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

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


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


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


========================================================
◆ 01.和暦を西暦に変換するクラス
========================================================

今回は、和暦を西暦に変換するクラスを作ってみましょう。

CalendarConverterというクラス名でjp.co.flsi.lecture.util
というパッケージに作成することにします。

以下がそのソース・コードの例です。
--------------------------------------------------------
package jp.co.flsi.lecture.util;

public class CalendarConverter {
   private int jaNameOfEra;  // 0 = 明治, 1 = 大正, 2 = 昭和, 3 = 平成
   private int jaYear;  // Japanese Calendar
   private int greYear;  // Gregorian Calendar
   private int Month;
   private int Day;
   public void setJaNameOfEra(int jaNameOfEra) {
      this.jaNameOfEra = jaNameOfEra;
   }
   public int getJaNameOfEra() {
      return jaNameOfEra;
   }
   public void setJaYear(int jaYear) {
      this.jaYear = jaYear;
   }
   public int getJaYear() {
      return jaYear;
   }
   public void setGreYear(int greYear) {
      this.greYear = greYear;
   }
   public int getGreYear() {
      return greYear;
   }
   public void setMonth(int month) {
      Month = month;
   }
   public int getMonth() {
      return Month;
   }
   public void setDay(int day) {
      Day = day;
   }
   public int getDay() {
      return Day;
   }
   public void convertJaCal2GreCal() {
      switch (getJaNameOfEra()) {
      case 0:
         setGreYear(getJaYear() + 1867);
         break;
      case 1:
         setGreYear(getJaYear() + 1911);
         break;
      case 2:
         setGreYear(getJaYear() + 1925);
         break;
      case 3:
         setGreYear(getJaYear() + 1988);
         break;
      default:
         setGreYear(0);
         break;
      }
   }
}
--------------------------------------------------------

switch文という新しい構文が出てきました。

switch (式) {
case 0:
   式の値が0の時に実行される文;
   break;
case 1:
   式の値が1の時に実行される文;
   break;

/*  ・・・・・中略・・・・・ */

default:
   式の値がその他の時に実行される文;
   break;
}

これは、switch(式)の括弧の中の式の値(計算式の場合は計算結果
の値、メソッド呼び出しの場合はその戻り値、変数の場合はその値)
が0の場合はcase 0:の所の文が実行され、1の場合はcase 1:の所の
文が実行され、どれにも該当しないときはdefault:のところの文が
実行されます。
それぞれの場合に実行できる文は複数指定可能ですが、break;のところ
に来たら実行が打ち止めになります。
break;というのはブロック(中括弧{ }で囲まれている範囲)の外に
出ることを意味します。

switch(式)の式の値はint型などの決められたプリミティブ型のみに
限定されていますが、詳しいことは後述します。


上記では、和暦から西暦(Gregorian Calendar)に変換するメソッド
をconvertJaCal2GreCal( )という名前で用意しましたが、まともに綴
ると滅茶苦茶長くなってしまうので、Japanese CalendarをJaCal、
Gregorian CalendarをGreCalと略し、Toを2(英語の発音が同じなので)
で代用しています。
ちょっと変なメソッド名だと感じるかもしれませんが、慣れてください。


逆に西暦から和暦に変換するメソッドも作りたいと思いますが、こちら
のほうは後の回にまわします。


それでは、このクラスを使って、和暦の年月日を入力すると西暦の
年月日に変換してくれるウィンドウを作りましょう。

CalendarConverterWindowというクラス名でjp.co.flsi.lecture.uiと
いうパッケージ(HumanWindowがはいっているのと同じパッケージ)に
作成することにします。

下記がその例です。

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

import java.awt.Button;
import java.awt.Checkbox;
import java.awt.CheckboxGroup;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.Panel;
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.util.CalendarConverter;

public class CalendarConverterWindow extends Frame {
   private CalendarEventListener eventListener
                 = new CalendarEventListener();
   private CalendarActionListener actionListener
                 = new CalendarActionListener();
   private Label labelJaCalendar = new Label();
   private Panel ckboxPanel = new Panel();
   private CheckboxGroup nameOfEraCkboxGroup = new CheckboxGroup();
   private Checkbox checkboxMeiji
                 = new Checkbox("明治", getNameOfEraCkboxGroup(), false);
   private Checkbox checkboxTaisho
                 = new Checkbox("大正", getNameOfEraCkboxGroup(), false);
   private Checkbox checkboxShowa
                 = new Checkbox("昭和", getNameOfEraCkboxGroup(), true);
   private Checkbox checkboxHeisei
                 = new Checkbox("平成", getNameOfEraCkboxGroup(), false);
   private Label labelJaYear = new Label();
   private Label labelJaMonth = new Label();
   private Label labelJaDay = new Label();
   private Label labelGreCalendar = new Label();
   private Label labelGreYear = new Label();
   private Label labelGreMonth = new Label();
   private Label labelGreDay = new Label();
   private Button convertJa2GreButton = new Button();
   private TextField textFieldJaYear = new TextField();
   private TextField textFieldJaMonth = new TextField();
   private TextField textFieldJaDay = new TextField();
   private TextField textFieldGreYear = new TextField();
   private TextField textFieldGreMonth = new TextField();
   private TextField textFieldGreDay = new TextField();

   class CalendarEventListener implements WindowListener {
      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 CalendarActionListener implements ActionListener {
      public void actionPerformed(ActionEvent e) {
         Button button = (Button)e.getSource();
         CalendarConverterWindow window
                      = (CalendarConverterWindow)button.getParent();
         CalendarConverter calendarConverter
                      = new CalendarConverter();
         if (window.getNameOfEraCkboxGroup().getSelectedCheckbox().getLabel().equals("明治"))
             calendarConverter.setJaNameOfEra(0);
         else if (window.getNameOfEraCkboxGroup().getSelectedCheckbox().getLabel().equals("大正"))
             calendarConverter.setJaNameOfEra(1);
         else if (window.getNameOfEraCkboxGroup().getSelectedCheckbox().getLabel().equals("昭和"))
             calendarConverter.setJaNameOfEra(2);
         else if (window.getNameOfEraCkboxGroup().getSelectedCheckbox().getLabel().equals("平成"))
             calendarConverter.setJaNameOfEra(3);
         calendarConverter.setJaYear(Integer.parseInt(window.getTextFieldJaYear().getText()));
         calendarConverter.setMonth(Integer.parseInt(window.getTextFieldJaMonth().getText()));
         calendarConverter.setDay(Integer.parseInt(window.getTextFieldJaDay().getText()));
         calendarConverter.convertJaCal2GreCal();
         window.getTextFieldGreYear().setText(Integer.toString(calendarConverter.getGreYear()));
         window.getTextFieldGreMonth().setText(Integer.toString(calendarConverter.getMonth()));
         window.getTextFieldGreDay().setText(Integer.toString(calendarConverter.getDay()));
      };
   };

   public CalendarConverterWindow()  {
      super();
      setTitle("和暦西暦変換");
      setSize(400, 150);
      setLayout(null);
      labelJaCalendar.setBounds(10, 30, 200, 20);
      ckboxPanel.setLayout(new GridLayout(1,4));
      ckboxPanel.add(checkboxMeiji);
      ckboxPanel.add(checkboxTaisho);
      ckboxPanel.add(checkboxShowa);
      ckboxPanel.add(checkboxHeisei);
      ckboxPanel.setBounds(45, 60, 180, 20);
      getTextFieldJaYear().setBounds(230, 60, 20, 20);
      labelJaYear.setBounds(255, 60, 20, 20);
      getTextFieldJaMonth().setBounds(290, 60, 20, 20);
      labelJaMonth.setBounds(315, 60, 20, 20);
      getTextFieldJaDay().setBounds(350, 60, 20, 20);
      labelJaDay.setBounds(375, 60, 20, 20);
      convertJa2GreButton.setBounds(120,90, 160, 20);
      labelGreCalendar.setBounds(10, 120, 200, 20);
      getTextFieldGreYear().setBounds(210, 120, 40, 20);
      labelGreYear.setBounds(255, 120, 20, 20);
      getTextFieldGreMonth().setBounds(290, 120, 20, 20);
      labelGreMonth.setBounds(315, 120, 20, 20);
      getTextFieldGreDay().setBounds(350, 120, 20, 20);
      labelGreDay.setBounds(375, 120, 20, 20);
      add(labelJaCalendar);
      add(ckboxPanel);
      add(getTextFieldJaYear());
      add(labelJaYear);
      add(getTextFieldJaMonth());
      add(labelJaMonth);
      add(getTextFieldJaDay());
      add(labelJaDay);
      add(convertJa2GreButton);
      add(labelGreCalendar);
      add(getTextFieldGreYear());
      add(labelGreYear);
      add(getTextFieldGreMonth());
      add(labelGreMonth);
      add(getTextFieldGreDay());
      add(labelGreDay);
      labelJaCalendar.setText("和暦:");
      labelJaYear.setText("年");
      labelJaMonth.setText("月");
      labelJaDay.setText("日");
      convertJa2GreButton.setLabel("和暦から西暦へ変換");
      labelGreCalendar.setText("西暦:");
      labelGreYear.setText("年");
      labelGreMonth.setText("月");
      labelGreDay.setText("日");
      convertJa2GreButton.addActionListener(actionListener);
      addWindowListener(eventListener);
      setVisible(true);
   }

   public CheckboxGroup getNameOfEraCkboxGroup() {
      return nameOfEraCkboxGroup;
   }

   public TextField getTextFieldJaYear() {
      return textFieldJaYear;
   }

   public TextField getTextFieldJaMonth() {
      return textFieldJaMonth;
   }

   public TextField getTextFieldJaDay() {
      return textFieldJaDay;
   }

   public TextField getTextFieldGreYear() {
      return textFieldGreYear;
   }

   public TextField getTextFieldGreMonth() {
      return textFieldGreMonth;
   }

   public TextField getTextFieldGreDay() {
      return textFieldGreDay;
   }

   public static void main(String[] args) {
      CalendarConverterWindow frame = new CalendarConverterWindow();
   }

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

以上のソース・コードの解説は次回に行います。

では、さっそくEclipseを起動して入力してみてください。

Eclipseの操作にもかなり慣れてきたことでしょうから、細かい手順の
説明は省略します。

しかし、慣れてきた人は、なるべくマウスの右ボタンを使って操作を
することが望ましいので、その点だけ少し解説しておきます。

マウスの右ボタンを使って操作をすると、メニュー・バーだけを使っ
て操作をするよりもマウスの移動時間が少なくなり、操作の時間が少し
短縮されます。

(1)まず、パッケージの作成ですが、パッケージ・エクスプローラーの中
のJStudy1(プロジェクト名)を右クリック(マウスの右ボタンでクリック)
します。

(2)「新規」→「パッケージ」を選択します。

(3)「名前」にjp.co.flsi.lecture.utilを入力し「完了」ボタンをクリック
します。

(4) パッケージ・エクスプローラーの中のJStudy1の配下のsrcの配下に
jp.co.flsi.lecture.util
ができているはずなので、それを右クリックします。

(5) 「新規」→「クラス」を選択します。

(6)「名前」にCalendarConverterを入力し、
「public static void main(String[] args)」
にはチェック・マークを入れずに「完了」ボタンをクリックします。

(7)エディター(「CalendarConverter」というタブがついている)が開い
たら、いつものようにソースコードを入力し、保管してください。

(8)同様にして、CalendarConverterWindowのほうも作成しましょう。
スーパークラスにjava.awtパッケージのFrameクラスを指定することを
忘れないでください。

(9)こちらもソース・コードの入力と保管が終わったら、実行してみましょう。
実行するにはパッケージ・エクスプローラーの中のjp.co.flsi.lecture.uiの
配下にあるCalendarConverterWindowを右クリックし、
「実行」→「Javaアプリケーション」を選択します。

(10)「和暦西暦変換」というウィンドウが表示されたら、和暦側の年号を
選択し、年月日を入力して「和暦から西暦へ変換」ボタンをクリックします。

西暦側に正しい年月日が表示されることを確認してください。


今回は、ここまでとします。



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

上記のCalendarConverterクラスにおいて、西暦から和暦に変換するメソッド
を自分で考えて、組み込んでみてください。



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

labelResponseです。



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