Report#7


    1.課題
    ■講義資料「GUIプログラム」をもとに、以下の課題を行え。
     1. 偶数奇数判定プログラム(GUIaa)をタイプし、その動作を考察せよ。
     2. 例外処理について、考察せよ。
     3. 上述のサンプルプログラムに出てきたGUI部品を、全て使ったプログラムを作成せよ。
     4. 摂氏から華氏、華氏から摂氏への温度換算ができるプログラムを作成せよ。。
     5. 「電卓」プログラム。中身は自分の思うように。
    

    2.解答及び考察
    1. 偶数奇数判定プログラム(GUIaa)をタイプし、その動作を考察せよ。
    
    (1)GUIaa.java
    ソースコード
    import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class GUIaa extends Applet { Button b0 = new Button("Even/Odd?"); Label x0 = new Label("Type a number and press..."); TextField t0 = new TextField(); public void init() { setLayout(null); add(t0); t0.setBounds(10, 40, 90, 30); add(b0); b0.setBounds(110, 40, 80, 30); add(x0); x0.setBounds(10, 80, 180, 30); b0.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { int i = (new Integer(t0.getText())).intValue(); t0.setText(""); if(i % 2 == 0) { x0.setText(i + " is Even"); } else { x0.setText(i + " is Odd"); } } }); } public static void main(String[] args) { Frame win = new GUIaa(); win.setSize(200, 150); win.setVisible(true); win.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent evt) { System.exit(0); } }); } }

    実行結果


    考察

    1.GUIについて
       a、Graphical User Interfaceの頭文字を取って略したもの。
        文字が並んだだけの(Character User Interface : CUI)の逆。
    
      b、キーボード以外の操作も可能。
        これにより操作方が増す。
    
    
    2.上記のプログラムについて
      (i)1、2行目の記述はGUIプログラムに必要なもの。
         import java.awt.*;     //GUI関係のパッケージクラス群をインポート
         import java.awt.event.*;     //アクションリスナー(イベント処理)を使うのに必要
    
      (ii)グラフィックの出力
         Button b0 = new Button("Even/Odd?");
        これでボタンを作成。ダブルクォートで囲まれた文字はそのままボタンの中に出力される。
         Label x0 = new Label("Type a number and press...");
        ラベルの作成。ダブルクォートで囲まれた文字をラベルとして出力。
         TextField t0 = new TextField();
        ウィンドウの作成。
    
      (iii)グラフィックの配置
         add(t0); t0.setBounds(10, 40, 90, 30);
        t0(ボタン)の配置。末尾の括弧内は順にウィンドウの左上を原点として(x座標、y座標、横幅、縦幅)以下同じ。
    
      (iv)イベント
         b0.addActionListener(new ActionListener() {
        ボタンが押された時の動作クラス
         public void actionPerformed(ActionEvent evt) {
          int i = (new Integer(t0.getText())).intValue();
        ここからは値の処理で入力された数値をint型で返し、その値をiに代入。
         if(i % 2 == 0) {
          x0.setText(i + " is Even");
         } else {
          x0.setText(i + " is Odd");
        数値判定。iが2で割り切れたら偶数(Even)それ以外は奇数(Odd)と判定。
        それぞれ「… is Even/ is Odd」と出力。
         Frame win = new GUIaa();
        Frameをwinに変換し、winの作成。
         win.setSize(200, 150); win.setVisible(true);
        ウィンドウのサイズを定義して、画面に出力。
         win.addWindowListener(new WindowAdapter() {
           public void windowClosing(WindowEvent evt) {
             System.exit(0);  
            プログラムコードから、当然普通に終わらすことの出来ないプログラムである。
           割り込みキー(Control + x)等で強制終了させる。
    
    TOPへ

    2. 例外処理について、考察せよ。
    
     ・例外処理とは、Javaが実行時のエラーを処理するための手段です。例外処理の基礎となるのはtryブロックであり、
        例外を発生させるコードをここに記述できる。
      ・try文について。
       tryブロック内で例外が発生した場合は、tryブロックの次に記述されているcatchブロックに対応する 例外処理が書かれてるかを検索します。 しかし、対応する例外処理が書かれていなければそのtryブロックを囲っているさらに上のtryブロックに書かれているctachブロックを検索します。
        つまり、例外処理が起きたメソッドを呼び出している呼び出し元のtry〜catch ブロックなどを探します。
    
    try{
       //センシティブなコード
       }
       catch (Exception1Type e1){
           //例外タイプ1を処理する
       }
       catch (Exception1Type e1){
           //例外タイプ2を処理する 
       }
            …
       finally {
           //tryブロックが終わる前に実行すべきコード
       }
    
    TOPへ

    3. 上述のサンプルプログラムに出てきたGUI部品を、全て使ったプログラムを作成せよ。
    
    (3)ALLGUI.java
    ソースコード
    import java.applet.Applet; import java.awt.*; public class ALLGUI extends Applet { Button button = new Button("Button"); Label label = new Label("Sample Components"); Label label2 = new Label("使っているパソコン"); Label label3 = new Label("好きな言語"); Label label4 = new Label("好きな音楽"); TextField textfield = new TextField("TextField"); Checkbox checkbox0 = new Checkbox("Win"); Checkbox checkbox1 = new Checkbox("Mac"); List list = new List(); TextArea textarea = new TextArea("TextArea"); Choice choice = new Choice(); public void init() { setLayout(null); add(label); label.setBounds(10 ,10 ,300,30 ); add(label2); label2.setBounds(170,110,100,20 ); add(label3); label3.setBounds(170,160,100,20 ); add(label4); label4.setBounds(10 ,90 ,100,20 ); add(textfield); textfield.setBounds(10 ,50 ,300,30 ); add(list); list.setBounds(10 ,110,150,100); add(checkbox0); checkbox0.setBounds(170,130,60 ,30 ); add(checkbox1); checkbox1.setBounds(240,130,60 ,30 ); add(choice); choice.setBounds(170,180,150,30 ); add(button); button.setBounds(10 ,220,300,30 ); add(textarea); textarea.setBounds(10 ,260,300,50 ); list.add("ポップス"); list.add("ロック"); list.add("ジャズ"); list.add("ヒップホップ"); list.add("R&B"); list.add("ハードロック"); list.add("へヴィーメタル"); list.add("ブルース"); list.add("パンク"); choice.add("C"); choice.add("Java"); } }

    注:実行されるまで時間がけっこうかかります
    実行結果


    考察

    ・Listコンポネートについて
    
      リストを表示するコンポーネント。生成すると長方形のスペースができ、その中に項目を置く。
      add( 文字列 );で、1行ずつ項目を追加して行く。
      使用可能なイベントはActionEventとItemEvent。 ItemEventはクリックで選択、もしくは選択解除された時に投げられる。
      ActionEventはダブルクリックで決定した時に投げられる。
       
    ・Checkboxコンポネートについて
    
      ある事象のオン・オフを表示するコンポーネント。
      クリックすると四角い窓にチェックが入る、もしくは既に入っていたら消される。
      仕様可能なイベントはItemEvent。getStateChange() メソッドでオン・オフを判別できる。
      
    ・Choiceコンポネートについて
    
       これはListとほとんど同じ機能を持つ。見た目とActionEventが無いところ、 それと複数選択できないところがListとの違い。
    
    TOPへ

    4. 摂氏から華氏、華氏から摂氏への温度換算ができるプログラムを作成せよ。
    
    (4)Temp.java
    ソースコード
    import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class Temp extends Applet { Button but = new Button("変換"); Label lab = new Label("温度を入力してください。"); TextField txt = new TextField(); Checkbox cb0 = new Checkbox("華氏 → 摂氏"); Checkbox cb1 = new Checkbox("摂氏 → 華氏"); CheckboxGroup cbG = new CheckboxGroup(); public void init() { //C=(F-32)*5/9 setLayout(null); add(txt); txt.setBounds(10, 40, 90, 30); add(but); but.setBounds(110, 40, 80, 30); add(lab); lab.setBounds(10, 20, 180, 20); cb0.setCheckboxGroup(cbG); cb1.setCheckboxGroup(cbG); cb0.setState(true); add(cb0); cb0.setBounds(10, 72, 100, 20); add(cb1); cb1.setBounds(10, 94, 100, 20); but.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { String str; int i; try{ double f = Double.parseDouble(txt.getText()); if(cb0.getState() == true){ str = Double.toString((f-32.0)*5.0/9.0); i = str.indexOf('.'); //System.out.println(str); lab.setText(f+"F = " +str.concat("000").substring(0,i+3)+"℃"); }else{ str = Double.toString((f*9.0/5.0)+32); i = str.indexOf('.'); //System.out.println(str); lab.setText(f+"℃ = " +str.concat("000").substring(0,i+3)+"F"); } }catch(Exception e){ lab.setText("数値のみを入力してください。(半角)"); } //テキストオブジェクトにフォーカスを与える txt.requestFocus(); txt.setText(""); } }); } public static void main(String[] args) { Frame win = new Temp(); win.setSize(200, 150); win.setVisible(true); win.setTitle("摂氏華氏変換"); win.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent evt) { System.exit(0); } }); } }

    実行結果


    考察

    ・ActionListener部分について
      
      華氏 → 摂氏のCheckboxがチェックされている場合
      if(cb0.getState() == true){
                            str = Double.toString((f-32.0)*5.0/9.0);
                            i = str.indexOf('.');
                            //System.out.println(str);
                            lab.setText(f+"F = "
                                        +str.concat("000").substring(0,i+3)+"℃");
                            
                        }
      この部分が作動し華氏から摂氏へ変換され表示される
      
      
      摂氏 → 華氏のCheckboxがチェックされている場合
      else{
                            str = Double.toString((f*9.0/5.0)+32);
                            i = str.indexOf('.');
                            //System.out.println(str);
                            lab.setText(f+"℃ = "
                                        +str.concat("000").substring(0,i+3)+"F");
                        }
      この部分が作動し摂氏から華氏へ変換され表示される
      奇数偶数判定プログラムを難しくしたようなものなので、似たような処理になっている。
    
    TOPへ

    5. 「電卓」プログラム。中身は自分の思うように。
    
    (5)Keisannki.java
    ソースコード
    import java.awt.*; import java.awt.event.*; import java.applet.Applet; public class Keisannki extends Applet{ long temp = 0; long temp2 = 0; String x = "="; boolean input = false; boolean input2 = false; int count = 0; TextField t0 = new TextField("0"); Label l0 = new Label(""); Button b0 = new Button("0"); Button b1 = new Button("1"); Button b2 = new Button("2"); Button b3 = new Button("3"); Button b4 = new Button("4"); Button b5 = new Button("5"); Button b6 = new Button("6"); Button b7 = new Button("7"); Button b8 = new Button("8"); Button b9 = new Button("9"); Button bC = new Button("C"); Button bAC= new Button("AC"); Button ba = new Button("+"); Button bb = new Button("-"); Button bc = new Button("×"); Button bd = new Button("÷"); Button be = new Button("="); class Buttonevent implements ActionListener {/*数字ボタンイベント用リスナ*/ public void actionPerformed(ActionEvent ae){ if(input == true){/*lv1 符号入力有り(符号入力あり、初期化必要)*/ if(input2 == true){/*lv2 符号入力による初期化判定(初期化済み)*/ if(count == 0){/*lv3 既入力判定(初入力)*/ if(ae.getActionCommand() != "0"){/*lv4 0入力判定(0入力でない)*/ t0.setText(ae.getActionCommand()); count++; }else{/*lv4 0入力判定(0入力)*/ t0.setText(ae.getActionCommand()); } }else{/*lv3 既入力判定(既入力)*/ t0.setText(t0.getText() + ae.getActionCommand()); count++; } }else{/*lv2 符号入力による初期化判定(初期化前)*/ if(ae.getActionCommand() != "0"){/*lv3 0入力判定(0入力でない)*/ t0.setText(ae.getActionCommand()); count++; }else{/*lv3 0入力判定(0入力)*/ t0.setText(ae.getActionCommand()); } input2 = true; } }else{/*lv1 符号入力判定(符号入力無し、初期化不必要)*/ if(count == 0){/*lv2 既入力判定(初入力)*/ if(ae.getActionCommand() != "0"){/*lv3 0入力判定(0入力でない)*/ t0.setText(ae.getActionCommand()); count++; }else{/*lv3 0入力判定(0入力)*/ t0.setText("0"); } }else{/*lv2 既入力判定(既入力)*/ t0.setText(t0.getText() + ae.getActionCommand()); count++; } } } } class Equalevent implements ActionListener {/*演算イベント用リスナ*/ public void actionPerformed(ActionEvent ae){ long temp3; try{/*エラー発生箇所*/ if(x != "="){/*lv1 最低1回の符号入力の有無判定(有り)*/ if(input != true){/*lv2 符号変更判定(変更無し)*/ temp = Long.parseLong(t0.getText()); }else{/*lv2 符号変更判定(変更有り)*/ temp2 = Long.parseLong(t0.getText()); } if(x == "+"){/*lv2 演算条件群*/ t0.setText(Long.toString(temp+temp2)); }else{ if(x == "-"){ t0.setText(Long.toString(temp-temp2)); }else{ if(x == "*"){ t0.setText(Long.toString(temp*temp2)); }else{ if(x == "/"){ t0.setText(Long.toString(temp/temp2)); }}}} if(Long.parseLong(t0.getText()) == 0){/*結果が0の時を例外として処理*/ count = 0; } input = false; input2 = false; } }catch(Exception ex){/*エラー処理*/ l0.setText("E"); t0.setText("0"); count = 0; temp = 0; temp2 = 0; x = "="; input = false; input2 = false; } } } class Xevent implements ActionListener {/*符号変更イベント用リスナ*/ public void actionPerformed(ActionEvent ae){ try{/*エラー発生箇所*/ temp = Long.parseLong(t0.getText()); x = ae.getActionCommand(); input = true; count = 0; l0.setText(ae.getActionCommand()); }catch(Exception ex){/*エラー処理*/ l0.setText("E"); t0.setText("0"); count = 0; temp = 0; temp2 = 0; x = "="; input = false; input2 = false; } } } public void init() {/*コンストラクタ(レイアウト、イベント設定)*/ setLayout(null);/*レイアウトマネージャのカット*/ add(t0); t0.setBounds(50, 40, 150, 20); /*以下、レイアウトの決め打ち*/ t0.setEditable(false); add(l0); l0.setBounds(20, 40, 30, 20); add(b0); b0.setBounds(10, 240, 40, 30); add(b1); b1.setBounds(10, 200, 40, 30); add(b4); b4.setBounds(10, 160, 40, 30); add(b7); b7.setBounds(10, 120, 40, 30); add(b2); b2.setBounds(60, 200, 40, 30); add(b5); b5.setBounds(60, 160, 40, 30); add(b8); b8.setBounds(60, 120, 40, 30); add(b3); b3.setBounds(110, 200, 40, 30); add(b6); b6.setBounds(110, 160, 40, 30); add(b9); b9.setBounds(110, 120, 40, 30); add(be); be.setBounds(60, 240, 90, 30); add(bC); bC.setBounds(110, 80, 40, 30); add(bAC); bAC.setBounds(10, 80,90 ,30); add(ba); ba.setBounds(170, 120, 40, 30); add(bb); bb.setBounds(170, 160, 40, 30); add(bc); bc.setBounds(170, 200, 40, 30); add(bd); bd.setBounds(170, 240, 40, 30); b0.addActionListener(new Buttonevent());/*以下、イベントのリスナを登録*/ b1.addActionListener(new Buttonevent()); b2.addActionListener(new Buttonevent()); b3.addActionListener(new Buttonevent()); b4.addActionListener(new Buttonevent()); b5.addActionListener(new Buttonevent()); b6.addActionListener(new Buttonevent()); b7.addActionListener(new Buttonevent()); b8.addActionListener(new Buttonevent()); b9.addActionListener(new Buttonevent()); bC.addActionListener(new ActionListener(){/*Clearボタン(無名クラスリスナ)*/ public void actionPerformed(ActionEvent ae){ t0.setText("0"); count = 0; } }); bAC.addActionListener(new ActionListener(){/*AllClearボタン(無名クラスリスナ)*/ public void actionPerformed(ActionEvent ae){ t0.setText("0"); l0.setText(""); count = 0; temp = 0; temp2 = 0; x = "="; input = false; input2 = false; } }); be.addActionListener(new Equalevent()); ba.addActionListener(new Xevent()); bb.addActionListener(new Xevent()); bc.addActionListener(new Xevent()); bd.addActionListener(new Xevent()); } public static void main(String[] args) { Frame win = new GUIaa(); win.setSize(300, 410); win.setVisible(true); win.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent evt) { System.exit(0); } }); } }

    実行結果


    考察

    普通の電卓を目指したが、結構な複雑さに挫折。結局、整数四則演算を電卓風にできる形で落ち着かせた。
    
    電卓として足りてない部分は
    ・整数での四則演算なので、小数が扱えず、除算が剰余の出る計算をする。
    ・桁あふれなどのエラー処理をしていないので、表示可能域を超えた計算をするとおかしくなる。
    
    電卓として機能している箇所は
    ・「C」「AC」の2つのクリアボタン
    ・「=」ボタン連打で連続計算が可能。
    
    TOPへ

    3.感想
    今回の課題は一番難易度が高かった。特に電卓はものすごい苦労した。
    次の課題はゲームをつくる課題だが、できるだけ期限を守って提出したい。
    


    戻る
    Wikiに戻る