シリーズ「開発の初めから順番に書いていってみる」の続きです。
設計手順には、要求分析、外部設計、内部詳細設計・プログラミング、単体テスト、結合テスト、総合テスト、運用テスト及び運用とあります。
現在プログラミングです。
(プログラミング以前は、ここ http://www.geocities.jp/xmldtp/index_kaihatsu.htm)
プログラミングでは決定表と自動生成のお話をします。
今、画面の自動生成で、特にBREWの自動生成版とJavaの画面自動生成を共存させる形でのアプローチをしています。
前回は、ソースと仕様書の関係で
・アプリ起動
・各画面
・各画面のイベントリスナーのクラス
の仕様書とソースがあることを示しました。
今回は、各画面の仕様書と雛形ソースです。
■各画面に関するソース
ここのgamen1.javaのうち、Shoriのところはいらないかなと。。
また、画面の中にある再描画や終了処理は、BREWとの対応でここにかきましたが、実際にはイベントリスナー内のメソッドでやってもらったほうがいいかなと・・そー考えると、こんなかんじ・・
import org.eclipse.swt.*; import org.eclipse.swt.widgets.*; import org.eclipse.swt.events.*; import java.util.*; public class gamen1 { // 共通領域 public HashMap map = null; // 画面項目項目 Display ff; Button b1; Button b2; Text t1; /* * 生成 */ public gamen1(HashMap map) { this.map = map; map.put("gamen1",this); draw(); } /* * 表示 */ public void draw() { // フレームを作成する ff =(Display)map.get("display"); f.setText("test"); f.setSize(240,320); f.setLayout(null); // アクションを作成する gamen1_HandleEvent al = new gamen1_HandleEvent(); // ラベル Label l1 = new Label(f,SWT.NULL); l1.setLocation(10,30); l1.setSize(100,30); l1.setText("早うちの練習"); Label l2 = new Label(f,SWT.NULL); l2.setLocation(10,120); l2.setSize(150,30); l2.setText("これは、練習文です。"); Label l3 = new Label(f,SWT.NULL); l3.setLocation(10,70); l3.setSize(100,30); l3.setText("以下の文を打とう!"); // テキスト t1 = new Text(f,SWT.NULL); t1.setLocation(10,160); t1.setSize(150,80); // ボタン作成 b1 = new Button(f,SWT.NULL); b1.setLocation(120,70); b1.setSize(100,30); b1.addSelectionListener(al); b1.setText("挑戦する"); // ボタン作成 b2 = new Button(f,SWT.NULL); b2.setLocation(10,250); b2.setSize(100,30); b2.addSelectionListener(al); b2.setText("打ち終わった!"); // 表示 f.open(); DispAppData(); // ウィンドウが破棄されるまでループ while (f.isDisposed() == false) { if (ff.readAndDispatch() == false) { ff.sleep(); } } } } |
(上記 < > ¥は、本当は半角)
■仕様書
BREWの場合と違うのは、当時のBREWは、大体縦横幅が決まってました。
しかし、今回のウィンドウは、縦横幅自由で、実際、
f.setSize(240,320);
で大きさを決めています。なので、この指定が必要です。
それと、コントロール種別はTEXTCTLは、テキストボックスとしても、
他のものはありません。そこで、LABELとBUTTONを導入します。
そうすると、こんなかんじ。
![](https://www.geocities.jp/xmldtp/zd_gamen1.jpg)
セルF3,H3が縦横指定です。
■雛形ソース
そうすると、雛形ソースはこんな感じ
import org.eclipse.swt.*; import org.eclipse.swt.widgets.*; import org.eclipse.swt.events.*; import java.util.*; public class $#$CELL D2$#$ { // 共通領域 public HashMap map = null; // 画面項目項目 Display ff; $#$REP 5$#$ $#$IFKETA C,BUTTON$#$ Button $#$KETA B$#$; $#$IFEND$#$ $#$IFKETA C,TEXTCTL$#$ Text $#$KETA B$#$; $#$IFEND$#$ $#$REPEND A$#$ /* * 生成 */ public $#$CELL D2$#$(HashMap map) { this.map = map; map.put("$#$CELL D2$#$",this); draw(); } /* * 表示 */ public void draw() { // フレームを作成する ff =(Display)map.get("display"); f.setText("test"); f.setSize($#$CELL F3$#$,$#$CELL H3$#$); f.setLayout(null); // アクションを作成する $#$CELL D2$#$_HandleEvent al = new $#$CELL D2$#$_HandleEvent(); $#$REP 5$#$ $#$IFKETA C,LABEL$#$ Label $#$KETA B$#$ = new Label(f,SWT.NULL); $#$KETA B$#$.setLocation($#$KETA D$#$,$#$KETA E$#$); $#$KETA B$#$.setSize($#$KETA F$#$,$#$KETA G$#$); $#$KETA B$#$.setText("$#$KETA H$#$"); $#$IFEND$#$ $#$IFKETA C,BUTTON$#$ // ボタン作成 $#$KETA B$#$ = new Button(f,SWT.NULL); $#$KETA B$#$.setLocation($#$KETA D$#$,$#$KETA E$#$); $#$KETA B$#$.setSize($#$KETA F$#$,$#$KETA G$#$); $#$KETA B$#$.addSelectionListener(al); $#$KETA B$#$.setText("$#$KETA H$#$"); $#$IFEND$#$ $#$IFKETA C,TEXTCTL$#$ // テキスト $#$KETA B$#$ = new Text(f,SWT.NULL); $#$KETA B$#$.setLocation($#$KETA D$#$,$#$KETA E$#$); $#$KETA B$#$.setSize($#$KETA F$#$,$#$KETA G$#$); $#$IFEND$#$ $#$REPEND A$#$ // 表示 f.open(); // al.disp(map); // ウィンドウが破棄されるまでループ while (f.isDisposed() == false) { if (ff.readAndDispatch() == false) { ff.sleep(); } } } } |
(上記 < > ¥は、本当は半角)
■BREWとの共存
縦横についてはBREWのときは見ないだけだから問題ないと思います。
BREWのときにあったHTMLCTLがなくなり、BUTTON,LABELが追加された件ですが、BREWの場合、$#$IFKETA C,BUTTON$#$に、BUTTONやLABELがないので、その行は無視されます。
同様に、JAVAのほうにHTMLCTLを書いても、無視されます。
そのため、仕様書に、両方の場合のケースを書いておけば、雛形指定に応じて、それぞれにあった部品だけを選んで、ソースにするため、共存できます。
ということで、各画面はおしまい。