1.偶数奇数判定プログラム(GUIaa)をタイプし、その動作を考察せよ。
import java.awt.*; //GUIに必要なクラスのインポ−ト import java.awt.event.*; public class GUIaa extends Frame{ //Frameクラスを継承 Button b0 = new Button("Even/Odd?"); //インスタンス変数を設定。 Label x0 = new Label("Type a number and press..."); TextField t0 = new TextField(); public GUIaa(){ //コンストラクを用いて、GUIaaを初期化 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); //表示欄の設定。 //(x1,y1,x2,y2)で(x1,y1)から(x2,y2)へと四角形を描く //(x1,y1)は始点となり、x2が幅,y2が高さとなる。 b0.addActionListener(new ActionListener(){ //ボタンが押された時のイベントを作る。ActionListernerオブジェクトを引数として取得する。 public void actionPerformed(ActionEvent evt){ //このメソッドは、ボタンクリック時に自動的にアクションリスナーオブジェクトメソッドを呼ぶ。 int i = (new Integer(t0.getText())).intValue(); //入力欄からgetTextメソッドをもちいて、入力された値受け取り、int型へキャストを行っている。 t0.setText(""); //表示される文字をnullに初期化を行う。 if(i%2 == 0){ //if文を用いて、偶数or奇数を判断する。 x0.setText(i + "is Even"); }else{ x0.setText(i + "is Odd"); } } }); } public static void main(String args[]){ Frame win = new GUIaa(); //Flameのインスタンス変数であるwinをGUIaaで初期化&生成 win.setSize(200,150); win.setVisible(true); //windowの大きさを設定,ディスプレイへの出力 win.addWindowListener(new WindowAdapter(){ //ウィンドウイベントを受け取るために登録、解除を行うメソッド //WindowAdapter()はウィンドウイベントを受け取るための抽象アダプタクラスである。 //アダプタとはインターフェースの型があわないオブジェクト同士を連結するためのもの。 public void windowClosing(WindowEvent evt){ //このメソッドはウィンドウが処理中である時に呼び出される。 //WindowEventはウィンドウがアクティブ、非アクティブの時にWindowオブジェクトによって生成される。 System.exit(0); //System.exitに0をjavaVMを渡す事で正常に終了を行う。 } }); //発生したイベントは、ウィンドウのaddWindowListernerメソッドを使って、そのイベントを受け取るように登録されているWindowAdapterオブジェクトに渡される。 //WindowAdapterオブジェクトは、WindowListernerインターフェースを実装している。それぞれのリスナーオブジェクトは、イベントが発生すると、windowEventを取得する。 } }
2.例外処理について、考察せよ。
例外が発生する典型的なケースは、整数を0除算した場合、配列のインデックスが負の値または配列の領域を
超える値だった場合、ファイルが見つからなかった場合、数値の形式が不正だった場合。その他に、例外の
引き金となる問題は数多くあります。java言語では、プログラムの実行中に発生した例外を、ユーザーの
用意した処理ルーチンで処理する事ができる。
構文的にはtryのステート面とでは、処理ブロックを{}で囲みます、この{}なかに例外の発生を監視する必要
のあるコードを記述する。tryブロックの直後にはいくつかのcatchブロックが続いている。catchブロックの先
頭にはcatchステートメントがあり引数が受け取られます。この引数は、発生した問題に関する情報を格納した
例外オブジェクトです。tryブロック内のコードを実行している時に例外が発生した場合、JVMではtryブロックの
実行を停止し、その種類の例外を処理できるcatchブロックを検索します。tryブロックの残りは実行されません。
検索は最初のcatchブロックから開始されます。例外オブジェクトの種類がcatchブロックのパラメータと一致した場合
は、その処理が実行されます。一致しなければ次のcatchブロック節に検索が進められる。
javaの例外処理の最大の長所は、構成の整った分かりやすいプログラムを書ける事です。
tryブロックを書けば、実行中に問題が起こった場合、明確に規定された方法で制御がcatchブロックに引き渡される
catchブロックの処理の実行が終わった時点で、制御はfinallyブロックに移行します。tryブロック内にreturn
ステートメントがあったとしても、呼び出し元に戻る前に必ずfinallyブロックが実行されます。
finallyブロックは省略する事もできるが、リソースを解放する為に使うと便利です。
例えば、この段階でファイルまたは、データベースを閉じる事ができる。
tryブロックには少なくとも1つのcatchブロックかfinallyブロックが必要です。そうでなければ、
コンパイルエラーが発生する。また、コンパイル時にはcatchブロックのパラダイスの型がチェックされ、パラメータ
がjava.lang.Throwableオブジェクトでなければ、エラーメッセージが表示される。
3.上述のサンプルプログラムに出てきたGUI部品を、全て使ったプログラムを作成せよ。
import java.awt.*; import java.awt.event.*; import java.util.Calendar; public class GUIunific extends Frame{ public static boolean sts = false; // stsはStarSignの略 public static String name = ""; //入力時の名前 public static String temp; //一時的に値を保存する Button bu0 = new Button("押す"); TextField tf0 = new TextField(); Label[] laL = new Label[]{new Label("名前を適当に入力したら、_押す_を押して。"), new Label("月"), new Label("日"), new Label("年"),}; TextArea ta0 = new TextArea(); CheckboxGroup cbg = new CheckboxGroup(); Checkbox[] cbL = new Checkbox[]{new Checkbox("12星座",cbg,true), new Checkbox("13星座",cbg,false)}; Choice[] chL = new Choice[]{new Choice(), new Choice()}; List li0 = new List(); GUIunific(){ setLayout(null); add(laL[0]); laL[0].setBounds(10,30,250,30); add(tf0); tf0.setBounds(10,60,250,20); add(bu0); bu0.setBounds(260,60,60,20); add(ta0); ta0.setBounds(120,160,220,122); add(cbL[0]); cbL[0].setBounds(10,95,80,30); add(cbL[1]); cbL[1].setBounds(90,95,80,30); add(chL[0]); chL[0].setBounds(120,135,40,50); add(laL[1]); laL[1].setBounds(160,135,20,20); add(laL[2]); laL[2].setBounds(220,135,20,20); add(laL[3]); laL[3].setBounds(95,135,20,20); add(chL[1]); chL[1].setBounds(180,135,40,50); add(li0); li0.setBounds(10,135,80,150); //選択する西暦を入れていく for(int i=1960; i <=2007; ++i){ String years=String.valueOf(i); li0.add(years); } //西暦を入力時にTextAreaを初期化 li0.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ev){ ta0.setText(""); } }); //生まれた月 chL[0].add("1"); chL[0].add("2"); chL[0].add("3"); chL[0].add("4"); chL[0].add("5"); chL[0].add("6"); chL[0].add("7"); chL[0].add("8"); chL[0].add("9"); chL[0].add("10"); chL[0].add("11"); chL[0].add("12"); //13星座にチェックが入ったとき cbL[1].addItemListener(new ItemListener(){ public void itemStateChanged(ItemEvent ev){ sts = cbL[1].getState(); System.out.println(sts); ta0.setText(""); //入力時にTextAreaを初期化 } }); //12星座にチェックが入ったとき cbL[0].addItemListener(new ItemListener(){ public void itemStateChanged(ItemEvent ev){ sts = cbL[1].getState(); System.out.println(sts); ta0.setText(""); //チェック時にTextAreaを初期化 } }); //月を決定したときにそのその時の日付を決定 chL[0].addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent ev){ Calendar cal = Calendar.getInstance(); cal.set(Calendar.YEAR, li0.getSelectedIndex()); System.out.println("chL[0]:years" + (li0.getSelectedIndex()+ 1960)); //西暦の確認 cal.set(Calendar.MONTH, chL[0].getSelectedIndex()); System.out.println("chL[0]:mons=" + (chL[0].getSelectedIndex()+1)); //選択した月の確認 int maxDays = cal.getActualMaximum(Calendar.DAY_OF_MONTH); chL[1].removeAll(); for(int i=0; i < maxDays; ++i){ String day=String.valueOf(i+1); chL[1].add(day); } System.out.println("maxDays ="+ maxDays); //選択した日の確認 } }); //日にちをを選択し場合星座を決定する。 chL[1].addItemListener(new ItemListener(){ public void itemStateChanged(ItemEvent ev){ int mons = (chL[0].getSelectedIndex() + 1); int days = (chL[1].getSelectedIndex() + 1); System.out.println("chL[1]days:mons ="+mons); System.out.println("chL[1]days:days ="+days); if(name.equals("")) ta0.setText("名前入力しろ(#゚Д゚)ゴルァ!!"); else { if(sts) sts13(mons, days); //13星座の誕生日別星座分け else sts12(mons, days); //12星座の誕生日別星座分け } } }); //何も入力されないとき返す文字 bu0.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ev){ name = tf0.getText(); if(name.equals("")){ tf0.setText("名前を入力してください "); } else { ta0.setText(name+"ですね。\n次に生年月日を入力してください。 "); } } }); } /*12星座での誕生日星座分けのプログラム */ private void sts12(int mons, int days){ temp = name; name += ("さんの\n12星座は"); if (mons == 1){ if(days < 20) ta0.setText(name + "山羊座 "); else ta0.setText(name +"水瓶座 "); } //2月の星座 if (mons == 2){ if(days < 19) ta0.setText(name +"水瓶座 "); else ta0.setText(name+"魚座 "); } //3月の星座 if (mons == 3){ if(days < 21) ta0.setText(name+"魚座 "); else ta0.setText(name+"牡羊座"); } //4月の星座 if (mons == 4){ if(days < 20) ta0.setText(name+"牡羊座 "); else ta0.setText(name+"牡牛座 "); } //5月の星座 if (mons == 5){ if(days < 21) ta0.setText(name+"牡牛座 "); else ta0.setText(name+"双子座 "); } //6月の星座 if (mons == 6){ if(days < 22) ta0.setText(name+"双子座 "); else ta0.setText(name+"蟹座 "); } //7月の星座 if (mons == 7){ if(days < 23) ta0.setText(name+"蟹座 "); else ta0.setText(name+"獅子座 "); } //8月の星座 if (mons == 8){ if(days < 23) ta0.setText(name+"獅子座 "); else ta0.setText(name+"乙女座 "); } //9月の星座 if (mons == 9){ if(days < 23) ta0.setText(name+"乙女座 "); else ta0.setText(name+"天秤座 "); } //10月の星座 if (mons == 10){ if(days < 24) ta0.setText(name+"天秤座 "); else ta0.setText(name+"蠍座 "); } //11月の星座 if (mons == 11){ if(days < 22) ta0.setText(name+"蠍座 "); else ta0.setText(name+"射手座 "); } //12月の星座 if (mons == 12){ if(days < 22) ta0.setText(name+"射手座 "); else ta0.setText(name+"山羊座 "); } name = temp; temp = null; System.out.println(name); } /*13星座で誕生日星座分けのプログラム*/ private void sts13(int mons, int days){ temp = name; name += ("さんの\n13星座は"); //1月の星座 if (mons == 1){ if(days < 20) ta0.setText(name +"射手座 "); else ta0.setText(name +"山羊座 "); } //2月の星座 if (mons == 2){ if(days < 17) ta0.setText(name +"山羊座 "); else ta0.setText("水瓶座 "); } //3月の星座 if (mons == 3){ if(days < 13) ta0.setText(name +"水瓶座 "); else ta0.setText(name +"魚座"); } //4月の星座 if (mons == 4){ if(days < 19) ta0.setText(name +"魚座 "); else ta0.setText(name+"牡羊座 "); } //5月の星座 if (mons == 5){ if(days < 15) ta0.setText(name+"あんた牡羊座 "); else ta0.setText("牡牛座 "); } //6月の星座 if (mons == 6){ if(days < 20) ta0.setText(name+"牡牛座 "); else ta0.setText(name+"双子座 "); } //7月の星座 if (mons == 7){ if(days < 20) ta0.setText(name+"双子座 "); else ta0.setText(name+"蟹座 "); } //8月の星座 if (mons == 8){ if(days < 10) ta0.setText(name+"蟹座 "); else ta0.setText(name+"獅子座 "); } //9月の星座 if (mons == 9){ if(days < 18) ta0.setText(name+"あんた獅子座 "); else ta0.setText(name+"乙女座 "); } //10月の星座 if (mons == 10){ if(days < 32) ta0.setText(name+"乙女座 "); } //11月の星座 if (mons == 11){ if(days < 24) ta0.setText(name+"天秤座 "); else if(days < 30) ta0.setText(name+"蠍座 "); else ta0.setText(name+"蛇使い座 "); } //12月の星座 if (mons == 12){ if(days < 18) ta0.setText(name+"蛇使い座 "); else ta0.setText(name+"射手座 "); } System.out.println(name); name = temp; temp = null; System.out.println(name); } public static void main(String[] args){ Frame win = new GUIunific(); win.setSize(400,300); win.setVisible(true); win.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent ev){ System.exit(0); } }); } }
4.摂氏から華氏、華氏から摂氏への温度換算ができるプログラムを作成せよ。
import java.awt.*; import java.awt.event.*; public class GUIc extends Frame { Button b0 = new Button("Calculate"); Label x0 = new Label("temperature conversion"); Label x1 = new Label(""); TextField t0 = new TextField(); Choice c0 = new Choice(); public GUIc() { setLayout(null); add(t0); t0.setBounds(10, 40, 80, 30); add(c0); c0.setBounds(100, 40, 80, 30); c0.add("F to C"); c0.add("C to F"); add(x1); x1.setBounds(10,80,80,30); add(b0); b0.setBounds(10, 120, 60, 30); add(x0); x0.setBounds(10, 160, 180, 30); b0.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { int temp = Integer.valueOf(t0.getText()).intValue(); int ch = c0.getSelectedIndex(); switch(ch){ case 0: temp -= 273; x1.setText(((temp >= -273) ? temp : 0) + "C"); break; case 1: temp += 273; x1.setText(temp + "F"); break; default : break; } } }); } public static void main(String[] arrgs) { Frame win = new GUIc(); win.setSize(200,200); win.setVisible(true); win.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent evt) { System.exit(0); } }); } }5.「電卓」プログラム。中身は自分の思うように。
import java.awt.*; import java.awt.event.*; public class Sisoku extends Frame{ public static double hi = 0; public static double mi = 0; public static double ans = 0; Choice ch = new Choice(); TextField[] tf = new TextField[]{ new TextField(), new TextField()}; TextArea ta = new TextArea(); Label eq = new Label("="); Sisoku(){ //コンストラクタここから setLayout(null); add(tf[0]); tf[0].setBounds( 10,60,100,30); add(ch); ch.setBounds(115,60, 50,30); add(tf[1]); tf[1].setBounds(170,60,100,30); add(eq); eq.setBounds(275,60, 5,30); add(ta); ta.setBounds(295,60,200,50); //四則演算をListに挿入 ch.add("+"); // listの0番目 ch.add("−"); // chの1番目 ch.add("×"); // chの2番目 ch.add("÷"); // chの3番目 //左のTextFieldの値をキャストした tf[0].addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ev){ hi = Double.parseDouble(tf[0].getText()); } }); //右のTextFieldの値をキャストした tf[1].addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ev){ mi = Double.parseDouble(tf[1].getText()); } }); //四則演算を決定したときに答えをいれる ch.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent ev){ int ope = ch.getSelectedIndex(); switch (ope) { case 0: ans = hi + mi; break; case 1: ans = hi - mi; break; case 2: ans = hi * mi; break; case 3: ans = hi / mi; break; default: break; } String anss=String.valueOf(ans); ta.setText(anss); } }); } public static void main(String[] args){ Frame win = new Sisoku(); win.setSize(500,300); win.setVisible(true); win.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent ev){ System.exit(0); } }); } }感想
今回のプログラミングではGUIプログラムについて調べようとしてもwebにあまり参考になるものが少なく
いつもより大変だった。さらに課題が多かったのでかなりきつかったです。