広告 |
---|
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■ 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. 不許無断複製 |