☆課題5☆
GUIプログラム:講義資料を参考に、以下の課題を行え。{〜01/15(Mon)}
偶数奇数判定プログラム(GUIaa)をタイプし、その動作を考察せよ。
例外処理について、考察せよ。
上述のサンプルプログラムに出てきたGUI部品を、全て使ったプログラムを作成せよ。
摂氏から華氏、華氏から摂氏への温度換算ができるプログラムを作成せよ。
「電卓」プログラム。中身は自分の思うように。
|
課題1 偶数奇数判定プログラム(GUIaa)をタイプし、その動作を考察せよ。
プログラム
import java.awt.*;
import java.awt.event.*;
public class GUIaa extends Frame {
Button b0 = new Button("Even||Odd");
Label x0 = new Label("Write a number");
TextField t0 = new TextField();
public GUIaa() {
setLayout(null);
add(t0); t0.setBounds(10, 40, 90, 30);
add(b0); b0.setBounds(110, 40, 90, 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);
}
});
}
}
|
実行結果
↓ ↓ ↓ ↓
〜考察〜
GUI
Graphical User Interfaceの頭文字を取って略したもの。
文字が並んだだけの(Character User Interface : CUI)の逆。
キーボード以外の操作も可能。
これにより操作方が増す
Button
ユーザーがボタン境界の内側でマウスをクリックすると、
ユーザーにフィードバックを提供するようにボタンの外観が変化する
Label(String str, int align)
strはラベルテキストで、alignは、ラベルを左揃え、中央揃え、右揃えのうちど
れにするかを示す定数。
定数LEFT,CENTER,RIGHTとして位置合わせの値を設定する。
GUI上に表示される文字列で、プログラムでは変更できますが、ユーザーが変更
することはできない
TextField(String str, int cols)
strはフィールドに入力されたテキストで、引数colsでは、フィールドの幅を字数で指定する。
TextFieldでは、1行のテキストを入力することができます。文字を入力すると、
テキストイベントが生成される。
ENTERキーを押したときにアクションイベントを生成される。
setLayout()
要素を配置する座標を計算する必要がないので、時間の節約にとなり、ユーザーは間違いを起こし
やすい作業を行わずにすむ。
2つ目にサイズを変更すると、要素の配置を動的に調整する。
3つ目にコンポーネントは一般的にプラットフォームによってサイズがことなる。
そのため、すべての環境に適した座標を一度に指定することはできない。
ここではsetLayout(null);になっているのでこれらの機能は失っている。
ActionEvent
ボタンを押したり、リスト項目をダブルクリックしたとき、メニュー項目を選択したときに生成さ
れる。
int i = (new Integer(t0.getText())).intValue();
t0.getText()でt0のテキストを読み込みIntegerで生成後のオブジェクトを不変なものとする。
setSize();
要素の数をsizeに変更する。sizeからはみ出した要素は破棄される。
windowClosing
ユーザーがウィンドウのクローズを要求するとwindowClosing()メソッドが呼び出される。
WindowEvent
ユーザーがウィンドウを活動化したとき、閉じたとき、非活動化したとき、
アイコン化解除したとき、アイコン化したとき、開いたとき、終了したときに生成される。
グラフィックの出力
Button b0 = new Button("Enter");
これでボタンを作成。末尾の括弧内の文字はそのままボタンの中に出力される。
Label x0 = new Label("数字を入力してください");
ラベルの作成。括弧内の文字をラベルとして出力。
TextField t0 = new TextField();
ウィンドウの作成。
グラフィックの配置
add(t0); t0.setBounds(10, 40, 90, 30);
t0(ボタン)の配置。末尾の括弧内は順に(ウィンドウの左上を中心にx座標、
y座標、横幅、縦幅)以下同じ。
イベント
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 + "は偶数です。");
} else {
x0.setText(i + "は奇数です。");
数値判定。iが2で割り切れたら偶数それ以外は奇数と判定。
それぞれ「…は偶数です。/奇数です。」と出力。
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);
画面を閉じるとアプリの終了。
課題2 例外処理について、考察せよ。
プログラム
try{
//センシティブなコード
}
catch (Exception1Type e1){
//例外タイプ1を処理する
}
catch (Exception1Type e1){
//例外タイプ2を処理する
}
…
finally {
//tryブロックが終わる前に実行すべきコード
}
|
〜考察〜
例外とはプログラムの実行中に発生した問題を通知するために、実行時に生成される
オブジェクトの事である。例外が発生する典型的なケースは、整数を0で除算した、
ファイルが見つからなかった、数値の形式が不正だった、等の場合である。
try{
処理内容
}
catch(例外1){
例外1が起きたときの処理
}
catch(例外2){
例外2が起きたときの処理
}
finally{
処理内容
}
tryで処理をしているときに問題が発生した場合、上から順にcatchブロックが
検索される。起きた問題と例外が合致するとcatch処理が行われる。
finallyは必ず最後に行われる処理である。try処理やcatch処理が終わると行われる。
課題3 上述のサンプルプログラムに出てきたGUI部品を、全て使ったプログラムを作成せよ。
プログラム
import java.awt.*;
import java.awt.event.*;
public class report5_3 extends Frame {
Button b0 = new Button("Send");
Label x0 = new Label("Curry Investigation");
Label x1 = new Label("Sex");
Label x2 = new Label("Age");
Label x3 = new Label("Job");
Label x4 = new Label("Address");
Label x5 = new Label("taste");
Label x6 = new Label("hot");
Label x7 = new Label("menu");
Label x8 = new Label("opinion");
Label x9 = new Label("");
TextField t0 = new TextField();
TextField t2 = new TextField();
Checkbox c0 = new Checkbox("Good");
add(c0); c0.setBounds(10, 230, 90, 30);
add(d0); d0.setBounds(90, 230, 90, 30);
add(c2); c2.setBounds(10, 280, 90, 30);
add(d2); d2.setBounds(90, 280, 90, 30);
add(c3); c3.setBounds(10, 330, 90, 30);
add(d3); d3.setBounds(90, 330, 90, 30);
add(l1); l1.setBounds(10, 60, 65, 40);
l1.add("Man"); l1.add("Woman");
add(t1); t1.setBounds(10, 380, 420, 200);
add(c1); c1.setBounds(10, 165, 120, 30);
c1.add("hokkaidou"); c1.add("touhoku"); c1.add("kanntou");
c1.add("toukai"); c1.add("kannsai"); c1.add("kinnki"); c1.add("chuugoku\");
c1.add("sikoku"); c1.add("kyuusyuu"); c1.add("okinawa");
b0.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
x9.setText("Thank you。");
}
});
}
public static void main(String[] args) {
Frame win = new report5_3();
win.setSize(450, 640);
win.setVisible(true);
}
}
|
実行結果
〜考察〜
カレーや屋さんのアンケート
・List
List l1 = new List();
はリストを表示するもので
add(l1); l1.setBounds(10, 60, 65, 40);
l1.add("Man"); l1.add("Woman");
で表示する位置とリストの内容を決める。
・Checkbox
Checkbox c0 = new Checkbox("Good");
Checkbox d0 = new Checkbox("Bad");
はチェックボックスを表示してチェックを付ける事が出来る。
・TextArea
TextArea t1 = new TextArea("");
記入欄を表示して、数行の記入が出来る。
・Choice
Choice c1 = new Choice();
選択肢の中から一つを選ぶ事が出来る。
add(c1); c1.setBounds(10, 165, 120, 30);
c1.add("北海道"); c1.add("東北"); c1.add("関東");
c1.add("東海"); c1.add("関西"); c1.add("中国"); c1.add("四国");
c1.add("九州"); c1.add("沖縄");
という風にして、位置や大きさ、選択肢を決める
課題4 摂氏から華氏、華氏から摂氏への温度換算ができるプログラムを作成せよ。
プログラム
import java.awt.*;
import java.awt.event.*;
public class kansan extends Frame{
Button b0 = new Button("F->C");
Button b1 = new Button("C->F");
Label x0 = new Label("befor");
Label x1 = new Label("after");
Label x2 = new Label("Please input temperature");
TextField t0 = new TextField();
b0.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
try{
int i = (new Integer(t0.getText())).intValue();
i = (int)Math.rint(1.8*i+32);
t1.setText("" + i);
x2.setText("C" + t0.getText() + "F" + i
);
}catch(Exception ex){
t1.setText("error");
}
}
});
b1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
try{
int i = (new Integer(t0.getText())).intValue();
i = (int)Math.rint((i-32)/1.8);
t1.setText("" + i);
x2.setText("F"+ t0.getText() +"C"+ i);
}catch(Exception ex){
t1.setText("error");
}
}
});
}
public static void main(String[] args) {
Frame win = new kansan();
win.setSize(230, 200); win.setVisible(true);
win.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent evt) {
System.exit(0);
}
});
}
}
|
実行結果
〜考察〜
ボタンF(華氏)を押した場合
b0.addActionListener(new ActionListener(){}の部分が実行されて、
入力された数字に1.8かけて32足した数字が下に表示される。
ボタンC(摂氏)を押した場合
b1.addActionListener(new ActionListener(){}の部分が実行されて、
入力された数字から32引いて1.8で割った数字が下に表示される。
数字以外のものが入力されるなどの例外が起こった場合どちらのボタン
を押してもerrorと表示される。
win.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent evt) {
System.exit(0);
}
});
でウィンドウを閉じた場合にシステムを終了させる。
課題5 「電卓」プログラム。中身は自分の思うようにせよ。
プログラム
import java.awt.*;
import java.awt.event.*;
public class keisan extends Frame{
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 bp = new Button("+");
Button bm = new Button("-");
Button be = new Button("=");
Button bk = new Button("*");
Button bw = new Button("/");
Button bc = new Button("AC");
Button bt = new Button(".");
Label lb = new Label("Calculator");
Button b7 = new Button("7");
Button b8 = new Button("8");
Button b9 = new Button("9");
Button bp = new Button("+");
Button bm = new Button("-");
Button be = new Button("=");
Button bk = new Button("*");
Button bw = new Button("/");
Button bc = new Button("AC");
Button bt = new Button(".");
Label lb = new Label("Calculator");
TextField label =new TextField();
double[] num = new double[]{0.0,0.0,};
int count=0;
int cal=0;
double a=1.0;
public keisan(){
setLayout(null);
add(b0); b0.setBounds(10,185,35,25);
add(b1); b1.setBounds(10,155,35,25);
add(b2); b2.setBounds(50,155,35,25);
add(b3); b3.setBounds(90,155,35,25);
add(b4); b4.setBounds(10,125,35,25);
add(b5); b5.setBounds(50,125,35,25);
add(b6); b6.setBounds(90,125,35,25);
add(b7); b7.setBounds(10,95,35,25);
add(b8); b8.setBounds(50,95,35,25);
add(b9); b9.setBounds(90,95,35,25);
add(bc); bc.setBounds(130,65,35,25);
add(bw); bw.setBounds(130,185,35,25);
add(bk); bk.setBounds(130,155,35,25);
add(bm); bm.setBounds(130,95,35,25);
add(bp); bp.setBounds(130,125,35,25);
add(be); be.setBounds(90,185,35,25);
add(bt); bt.setBounds(50,185,35,25);
add(lb); label.setBounds(10,30,155,25);
add(label); lb.setBounds(10,65,185,25);
try{
b0.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
if(a<1){
num[count]=num[count];
a=a*0.1;
}else{
num[count]=num[count]*10;
}
label.setText(num[count] + "");
}
});
b1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
if(a<1){
num[count]=num[count]+a;
a=a*0.1;
}else{
num[count]=num[count]*10+1;
}
label.setText(num[count] + "");
}
});
b2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
if(a<1){
num[count]=num[count]+a*2.0;
a=a*0.1;
}else{
num[count]=num[count]*10+2.0;
}
label.setText(num[count] + "");
}
});
b3.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
if(a<1){
num[count]=num[count]+a*3.0;
a=a*0.1;
}else{
num[count]=num[count]*10+3.0;
}
label.setText(num[count] + "");
}
});
b4.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
if(a<1){
num[count]=num[count]+a*4.0;
a=a*0.1;
}else{
num[count]=num[count]*10+4.0;
}
label.setText(num[count] + "");
}
});
b5.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
if(a<1){
num[count]=num[count]+a*5.0;
a=a*0.1;
}else{
num[count]=num[count]*10+5.0;
}
label.setText(num[count] + "");
}
});
b6.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
if(a<1){
num[count]=num[count]+a*6.0;
a=a*0.1;
}else{
num[count]=num[count]*10+6.0;
}
label.setText(num[count] + "");
}
});
b7.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
if(a<1){
num[count]=num[count]+a*7.0;
a=a*0.1;
}else{
num[count]=num[count]*10+7.0;
}
label.setText(num[count] + "");
}
});
b8.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
if(a<1){
num[count]=num[count]+a*8.0;
a=a*0.1;
}else{
num[count]=num[count]*10+8.0;
}
label.setText(num[count] + "");
}
});
b9.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
if(a<1){
num[count]=num[count]+a*9.0;
a=a*0.1;
}else{
num[count]=num[count]*10+9.0;
}
label.setText(num[count] + "");
}
});
bc.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
num[0]=0;
num[1]=0;
cal=0;
count=0;
a=1.0;
label.setText(num[count] + "");
}
});
bp.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
if(cal==1){num[0]=num[0]+num[1];}
if(cal==2){num[0]=num[0]-num[1];}
if(cal==3){num[0]=num[0]*num[1];}
if(cal==4){num[0]=num[0]/num[1];}
label.setText(num[0] + "");
cal=1;
count=1;
num[1]=0.0;
a=1.0;
}
});
bm.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
if(cal==1){num[0]=num[0]+num[1];}
if(cal==2){num[0]=num[0]-num[1];}
if(cal==3){num[0]=num[0]*num[1];}
if(cal==4){num[0]=num[0]/num[1];}
label.setText(num[0] + "");
cal=2;
count=1;
num[1]=0.0;
a=1.0;
}
});
bk.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
if(cal==1){num[0]=num[0]+num[1];}
if(cal==2){num[0]=num[0]-num[1];}
if(cal==3){num[0]=num[0]*num[1];}
if(cal==4){num[0]=num[0]/num[1];}
label.setText(num[0] + "");
cal=3;
count=1;
num[1]=0.0;
a=1.0;
}
});
bw.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
if(cal==1){num[0]=num[0]+num[1];}
if(cal==2){num[0]=num[0]-num[1];}
if(cal==3){num[0]=num[0]*num[1];}
if(cal==4){num[0]=num[0]/num[1];}
label.setText(num[0] + "");
cal=4;
count=1;
num[1]=0.0;
a=1.0;
}
});
be.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
if(cal==1){num[0]=num[0]+num[1];}
if(cal==2){num[0]=num[0]-num[1];}
if(cal==3){num[0]=num[0]*num[1];}
if(cal==4){num[0]=num[0]/num[1];}
label.setText(num[0] + "");
cal=0;
count=0;
num[1]=0.0;
num[0]=0.0;
a=1.0;
}
});
bt.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
a=0.1;
}
});
}catch(Exception evt){
label.setText(evt.toString());
}
}
public static void main(String[] args) {
Frame win = new keisan();
win.setSize(200, 250);
win.setVisible(true);
win.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent evt) {
System.exit(0);
}
});
}
}
|
〜考察〜
数字ボタン(0など)で、同じ"2"(一例)というボタンが押された場合でも、
それがどの位にあたるものなのか考えなければならない。
そこで変数aを用いた場合分けをする。初期設定a=1.0であり、
a<1すなわち他の数字ボタンが"C"や"="より前に押されていない場合と
それ以外の場合でif文を用いた場合分けをしている
(count=0または1しかないのでこれが可能になる)
演算ボタン(+など)は、変数cal(初期設定は0)に四則演算のそれぞれの働きを持たせ、
各ボタンに割り振る。
また演算ボタンが押された時点でcount=1とし同時にnum[1]とaを初期化する。
これによってさらに演算を続けて行く事ができる。
なお"="は演算の結果を表示するのみで、"AC"は全ての値を初期化する。
〜感想〜
計算機などを作れるなんて凄いなと思った。
なんか、今まではこういう物のプログラムはどんな風に作ってるのか見当もつかなかったが、
今回で頑張れば作っていけるものなんだな、と認識を改めることが出来たので良かったと思う。
〜参考文献〜
独習java
とほほのWWW入門(http://www.tohoho-web.com/www.htm)
|