GUI プログラム Ⅱ 前回課題の制作例 ファイル名 :awtsave.java import java.awt.*; import java.awt.event.*; public class awtsave extends Frame // Button クラスの宣言 Button btnsave; Label lblcaption1, lblcaption2, lblcaption3; Label lblcaption4, lblcaption5, lblcaption6; TextField txtname, txtzip; TextArea txtaddress; CheckboxGroup cg; Checkbox chksex1, chksex2; Checkbox chkhobby1, chkhobby2, chkhobby3, chkhobby4, chkhobby5; Choice cboorigin; // コンストラクタ public awtsave(string title, int width, int height, int top, int left, boolean resize) // ウィンドウの設定 settitle(title); setsize(width, height); if(top>0 && left>0) setlocation(top, left); else Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); setlocation((d.width-width)/2,(d.height-height)/2); setresizable(resize); // レイアウトマネージャの無効化 setlayout(null); // チェックボックスのグループ cg = new CheckboxGroup(); -1-
// コンポーネントの生成 lblcaption1 = new Label(" 氏名 "); add(lblcaption1); lblcaption1.setbounds(20, 30,60,20); txtname = new TextField(); add(txtname); txtname.setbounds(90, 30,200,20); lblcaption2 = new Label(" 郵便番号 "); add(lblcaption2); lblcaption2.setbounds(20, 60,60,20); txtzip = new TextField(); add(txtzip); txtzip.setbounds(90, 60,80,20); lblcaption3 = new Label(" 住所 "); add(lblcaption3); lblcaption3.setbounds(20, 90,60,20); txtaddress = new TextArea(); add(txtaddress); txtaddress.setbounds(90, 90,200,60); lblcaption4 = new Label(" 性別 "); add(lblcaption4); lblcaption4.setbounds(20,160,60,20); chksex1 = new Checkbox(" 男性 ",cg,true); add(chksex1); chksex1.setbounds(90,160,70,20); chksex2 = new Checkbox(" 女性 ",cg,false); add(chksex2); chksex2.setbounds(160,160,70,20); lblcaption5 = new Label(" 趣味 "); add(lblcaption5); lblcaption5.setbounds(20,190,60,20); chkhobby1 = new Checkbox(" 磯釣り "); add(chkhobby1); chkhobby1.setbounds(90,190,70,20); chkhobby2 = new Checkbox(" 海釣り "); add(chkhobby2); chkhobby2.setbounds(160,190,70,20); chkhobby3 = new Checkbox(" 船釣り "); add(chkhobby3); chkhobby3.setbounds(230,190,70,20); chkhobby4 = new Checkbox(" 沖釣り "); add(chkhobby4); chkhobby4.setbounds(90,220,70,20); chkhobby5 = new Checkbox(" 渓流釣り "); add(chkhobby5); chkhobby5.setbounds(160,220,70,20); lblcaption6 = new Label(" 本籍地 "); add(lblcaption6); lblcaption6.setbounds(20,250,60,20); cboorigin = new Choice();add(cboOrigin); cboorigin.setbounds(90,250,100,20); cboorigin.additem(" 北海道 "); cboorigin.additem(" 青森 "); cboorigin.additem(" 秋田 "); cboorigin.additem(" 岩手 "); cboorigin.additem(" 福島 "); // Button クラスの生成 btnsave = new Button(" 保存 "); add(btnsave); btnsave.setbounds(20,280,130,30); // 匿名内部クラス ( ウィンドウリスナ用 ) WindowAdapter wad = new WindowAdapter() public void windowclosing(windowevent e) System.exit(0); ; addwindowlistener(wad); // 匿名内部クラス ( アクションリスナ用 ) ActionListener cal = new ActionListener() public void actionperformed(actionevent e) System.exit(0); ; btnsave.addactionlistener(cal); -2-
ファイル名 :awttest.java public class awttest public static void main(string arg[]) //=============================================== // ウィンドウ (Frame クラス ) のインスタンスを生成 //=============================================== awtsave win = new awtsave(" 簡易データベース ", 310, 320, -1, -1, false); //================== // ウィンドウの表示 //================== win.setvisible(true); 課題 1. 下記の各項目をカンマ区切のファイル ( ファイル名 :easydb.csv) と仕て保存する 氏名入力用の TextField の記入データ ( インスタンス名 txtname) 郵便番号入力用の TextField の記入データ ( インスタンス名 txtzip) 住所入力用の TextArea の記入データ ( インスタンス名 txtaddress) 性別選択用の CheckBox の選択項目のキャプション ( インスタンス名 chksex) 趣味選択用の CheckBox の選択状況 ( インスタンス名 chkhobby) 本籍地選択用の Choice の選択項目名 ( インスタンス名 cboorigin) 猶 趣味の項目は 選択されて居れば を 選択されて居なければ を保存する 従って 1 レコードのフィールド数は 10 と成る ( 趣味の選択項目が 5 の場合 ) 例 : 宇野,601-8441, 京都市南区, 男性,,,,,, 京都 上記のレコードを 保存ボタンがクリックされる毎に 保存する 2. 上記の各項目をアクセスファイル ( ファイル名 :easydb.mdb) と仕て保存する アクセスファイルは テーブル名を easydb とし 上記項目に合わせたフィールドを作成して 同じフォルダに 予め 保存して置く フィールド名の例は 下記の通り NAME,ZIP,ADDRESS,SEX,HOBBY1,HOBBY2, HOBBY3, HOBBY4, HOBBY5,ORIGIN 上記の easydb.mdb を参照する easydb と謂う名前の DSN を登録する 登録は コントロールパネル ODBC データソース で行う データを保存する手順は java.sql の総てのコンポーネントのインポート ドライバクラスのロード データベースに接続 ステートメントオブジェクトの生成 SQL の発行で有る -3-
CSV ファイルに保存 ファイル名 :awtsave.java 匿名内部クラス ( アクションリスナ用 ) の部分而巳 import java.io.*; // 追加 // 匿名内部クラス ( アクションリスナ用 ) ActionListener cal = new ActionListener() public void actionperformed(actionevent e) // データ格納用配列の宣言 String d[] = new String[10]; String all = ""; // コンポーネントからデータ取得 d[0] = txtname.gettext(); d[1] = txtzip.gettext(); d[2] = txtaddress.gettext(); if(chksex1.getstate() == true)d[3] = chksex1.getlabel(); elsed[3] = chksex2.getlabel(); if(chkhobby1.getstate() == true)d[4] = " "; else d[4] = " "; if(chkhobby2.getstate() == true)d[5] = " "; else d[5] = " "; if(chkhobby3.getstate() == true)d[6] = " "; else d[6] = " "; if(chkhobby4.getstate() == true)d[7] = " "; else d[7] = " "; if(chkhobby5.getstate() == true)d[8] = " "; else d[8] = " "; d[9] = cboorigin.getselecteditem(); for(int i=0; i<9; i++)all += (d[i] + ","); all += (d[9] + " n"); for(int i=0; i<10; i++)system.out.println("d[" + i + "]:" + d[i]); System.out.println("ALL :" + all); ; // データの保存 (CSV 形式 ) try FileWriter fw = new FileWriter("easydb.csv", true); fw.write(all); fw.close(); catch(exception ex) 課題 1. 上記のコードでは データは 常に 1 レコードしか保存され無い 此れを 保存する毎に データが追加される様に変更する 即ち 上書モードでは無く 追加モードで保存する様にする java.io.filewriter クラスのコンストラクタを利用 -4-
アクセスファイルに保存 ファイル名 :awtsave.java データの保存 ( アクセス形式 ) の部分而巳 import java.sql.*; // 追加 (java.io.* は不要 ) // データの保存 ( アクセス形式 ) try // ドライバクラスをロード Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // データベースへ接続 Connection cn = DriverManager.getConnection("jdbc:odbc:easydb"); // ステートメントオブジェクトを生成 Statement st = cn.createstatement(); // 全てのフィールドを挿入する SQL 文を作成 String sql = "INSERT INTO easydb VALUES("; for(int i=0; i<9; i++)sql += ("'"+d[i]+"',"); sql += ("'"+d[9]+"')"); // クエリーを実行 st.executequery(sql); // データベースから切断 st.close( ); cn.close( ); catch(exception ex) 参考 MS ACCESS の場合 1 ドライバクラスをロード Class.forName( "sun.jdbc.odbc.jdbcodbcdriver" ); 2 接続文字列の設定 String cs = "jdbc:odbc:easydb"; 3 データベースへ接続 Connection cn = DriverManager.getConnection(cs); 4 ステートメントを生成 Statement st = cn.createstatement( ); 5 SQL 文を作成 String sql = "INSERT INTO easydb VALUES( "+d[0]+", )"; 6 クエリーを実行 st.executequery( sql ); 7 データベースから切断 st.close( ); cn.close( ); mysql の場合 1 ドライバクラスをロード Class.forName( "org.gjt.mm.mysql.driver" ); 2 接続文字列の設定 String cs = "jdbc:mysql:///easydb?useunicode=true&characterencoding=sjis"; postgresql の場合 1 ドライバクラスをロード Class.forName( "org.postgresql.driver" ); 2 接続文字列の設定 String cs = "jdbc:postgresql:easydb"; 3 データベースへ接続 Connection cn = DriverManager.getConnection(cs, "postgres", ""); -5-