GUI プログラム Ⅴ 前回課題の制作例 ファイル名 :awttest.java public class awttest public static void main(string arg[]) //=============================================== // ウィンドウ (Frame クラス ) のインスタンスを生成 //=============================================== awtdb win = new awtdb(" 簡易データベース ", 520, 350, -1, -1, false); 変更 //================== // ウィンドウの表示 //================== win.setvisible(true); ファイル名 :awtdb.java ベースは Ⅱ の awtsave.java と Ⅳ の awtimage.java import java.awt.*; import java.awt.event.*; import java.io.*; import javax.swing.*; public class awtdb extends Frame awtgrid grd = new awtgrid(" データ表示画面 ", 800, 300, -1, -1, false); 追加 // コンポーネントクラスの宣言 Button btnsave, btnload, btnbrowse; Label lblcaption1, lblcaption2, lblcaption3, lblcaption4; Label lblcaption5, lblcaption6, lblcaption7; TextField txtname, txtzip, txtimage; TextArea txtaddress; CheckboxGroup cg; Checkbox chksex1, chksex2; Checkbox chkhobby1, chkhobby2, chkhobby3, chkhobby4, chkhobby5; Choice cboorigin; Image imgpicture = null; // コンストラクタ public awtdb(string title, int width, int height, int top, int left, boolean resize) // ウィンドウの設定 settitle(title); setsize(width, height); -1-
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(); // コンポーネントの生成 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(); cboorigin.additem(" 北海道 "); cboorigin.additem(" 青森 "); cboorigin.additem(" 秋田 "); cboorigin.additem(" 岩手 "); cboorigin.additem(" 福島 "); add(cboorigin); cboorigin.setbounds(90,250,100,20); lblcaption7 = new Label(" 画像 "); add(lblcaption7); lblcaption7.setbounds(20,280,60,20); txtimage = new TextField(); add(txtimage); txtimage.setbounds(90,280,200,20); // Button クラスの生成 btnsave = new Button(" 保存 "); add(btnsave); btnsave.setbounds(120,310,130,30); btnload = new Button(" 一覧 "); add(btnload); btnload.setbounds(260,310,130,30); btnbrowse = new Button(" 参照..."); add(btnbrowse); btnbrowse.setbounds(300,280,50,20); // 匿名内部クラス ( ウィンドウリスナ用 ) WindowAdapter wad = new WindowAdapter() public void windowclosing(windowevent e) System.exit(0); ; addwindowlistener(wad); -2-
// 匿名内部クラス ( アクションリスナ用 ) ActionListener cal = new ActionListener() public void actionperformed(actionevent e) Object obj = e.getsource(); // 保存ボタンがクリックされた時 if(obj == btnsave) // データ格納用配列の宣言 String d[] = new String[11]; 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(); d[10] = txtimage.gettext(); for(int i=0; i<10; i++)all += (d[i] + ","); all += (d[10] + " n"); for(int i=0; i<11; 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) // 一覧ボタンがクリックされた時追加 else if(obj == btnload) grd.setvisible(true); // 参照ボタンがクリックされた時 else if(obj == btnbrowse) // ファイルの指定 ( 匿名内部クラスで定義 ) JFileChooser fd = new JFileChooser(); // フィルタの設定 fd.setfilefilter ( // 下記はフルネームで記述する (java.io.filefilter と区別する為 ) new javax.swing.filechooser.filefilter() public boolean accept(file f) if (f!= null) -3-
// ディレクトリの場合 if (f.isdirectory()) return true; // ファイルの場合 String s = f.getname(); int i = s.lastindexof('.'); if (i!= -1) s = s.substring(i+1).tolowercase(); if ((s.equals("jpg")) (s.equals("gif"))) return true; return false; public String getdescription() return " 画像ファイル (JPG,GIF)"; ); // ファイル選択ダイアログの表示 fd.showopendialog(null); // ファイル名 ( フルパス ) の表示 // getselectedfile:javax.swing.jfilechooser クラスのメソッド // getabsolutepath:java.io.file クラスのメソッド txtimage.settext(fd.getselectedfile().getabsolutepath()); // 画像の表示 Toolkit tk = Toolkit.getDefaultToolkit(); imgpicture = tk.getimage(txtimage.gettext()); repaint(); ; btnsave.addactionlistener(cal); btnload.addactionlistener(cal); btnbrowse.addactionlistener(cal); // 画面描画メソッド public void paint(graphics g) if (imgpicture!= null) super.paint(g); g.drawimage(imgpicture,300,30,200,240,this); -4-
ファイル名 :awtgrid.java ベースは Ⅲ の awtload.java import java.awt.*; import java.awt.event.*; import java.io.*; import java.util.*; public class awtgrid extends Frame // グローバルな定数と変数の宣言 final int MAX = 100; // 最大レコード数 String d[][] = new String[MAX][11]; // データ保存用 int cnt; // データ数 ( レコード数 ) int page; // 表示ページ番号 変更 // コンポーネントの宣言 Button btnload, btnprev, btnnext; Panel pnlbase; Label lbldisp[] = new Label[100]; // コンストラクタ public awtgrid(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); // レイアウトを BorderLayput に設定 setlayout(new BorderLayout()); // コンポーネントの生成と配置 btnload = new Button(" 読込 "); add("south", btnload); btnprev = new Button(" 前へ "); add("west", btnprev); btnnext = new Button(" 次へ "); add("east", btnnext); pnlbase = new Panel(new GridLayout(10, 10)); add("center", pnlbase); for(int i=0; i<100; i++) lbldisp[i] = new Label(); pnlbase.add(lbldisp[i]); if(i<10) lbldisp[i].setbackground(new Color( 0, 0,255)); lbldisp[i].setforeground(new Color(255,255,255)); switch(i) case 0: lbldisp[i].settext(" 氏名 "); break; case 1: lbldisp[i].settext(" 郵便番号 "); break; case 2: lbldisp[i].settext(" 住所 "); break; case 3: lbldisp[i].settext(" 性別 "); break; -5-
case 4: lbldisp[i].settext(" 磯釣り "); break; case 5: lbldisp[i].settext(" 海釣り "); break; case 6: lbldisp[i].settext(" 船釣り "); break; case 7: lbldisp[i].settext(" 沖釣り "); break; case 8: lbldisp[i].settext(" 渓流釣 "); break; case 9: lbldisp[i].settext(" 本籍地 "); break; elselbldisp[i].settext(""+i); pnlbase.setvisible(true); // 匿名内部クラス ( ウィンドウリスナ用 ) WindowAdapter wad = new WindowAdapter() public void windowclosing(windowevent e) setvisible(false);; ; addwindowlistener(wad); // 匿名内部クラス ( アクションリスナ用 ) ActionListener cal = new ActionListener() public void actionperformed(actionevent e) Object obj = e.getsource(); if(obj == btnload) try String all; // 入力ファイルのオープン BufferedReader br = new BufferedReader(new FileReader("easydb.csv")); cnt = 0; while ((all = br.readline())!= null) StringTokenizer st = new StringTokenizer(all, ","); while(st.hasmoretokens()) for(int i=0; i<11; i++) d[cnt][i] = st.nexttoken(); cnt++; // ファイルのクローズ br.close(); catch (Exception ex) // データの表示 page = 0; datadisplay(page); 変更 else if(obj == btnprev) page--; datadisplay(page); -6-
else if(obj == btnnext) page++; datadisplay(page); ; btnload.addactionlistener(cal); btnprev.addactionlistener(cal); btnnext.addactionlistener(cal); // 表示メソッド ( サブルーチン ) void datadisplay(int p) int start = p * 9; if(start<0 start>=cnt)return; for(int i=start; i<start+9; i++) if(i>=cnt)break; for(int j=0; j<10; j++) //System.out.println("dimention:"+(((i+1)*10+j) % 90)); lbldisp[(i*10+j) % 90 + 10].setText(d[i][j]); 課題 1. 上記の例では CSV( カンマ区切り ) ファイルを対象と仕て居るが MDB( アクセス ) ファイルでも同じ事が出来る様にする 2. メイン画面で 前へ と 次へ のボタンを追加し 1 レコード宛 移動表示する事が出来る様にする 3. 更に 変更 のボタンを追加し 表示されて居るデータに変更が為された場合 データの更新を行う事が出来る様にする 4. 一覧画面で レコードをクリックして選択すると 当該レコードのデータが メイン画面に表示される様にする -7-