シリーズJavaの画面表示のつづきです。
現在は、SWTについてやっています。
前回、1画面用のソースを書いたのですが、これを使って、第二画面を出そうとすると、エラーになります。
SWTとAWTを混在させ、SWT画面に対して、AWTの画面のプログラムから、何かさせるのは、いけなさそう。。。は、まだしも、
SWTの第一画面とSWTの第二画面を同時にだしてもだめでした。
どうも、Displayは、アプリで1個のようです。
ということで、
・アプリ開始時にDisplayを取得して、
それを共通領域のハッシュマップにいれます。
・各画面では、Displayをnewで生成するかわりに、共通領域からとってくる
・ウィンドウ(シェル)が破棄されたとき、ディスプレイも破棄していましたが、
それを中止、そのかわり、アプリを抜ける(System.exit)ときにする。
それと、いままで、画面を1つしか出さないとき、
次の画面が出てから消していましたが、
そうすると、同時に2つの画面がでて、おかしくなることがあるので、
画面を消してから、次の画面を出すようにしました。
以上の修正をすると、以下のようなソースになります。
■ソース
●まず、アプリ起動のプログラムは、こちら(test.java)
import java.util.*; import org.eclipse.swt.widgets.*; public class test{ /* * メイン処理 */ public static void main(String[] args) { HashMap map= new HashMap(); // モデルクラスの生成 Shori shori = new Shori(map); // 共通領域への値設定 map.put("username","ウィリアムのいたずら"); // フレームを作成する Display ff =new Display(); map.put("display",ff); // 削除する // map.put("dispose","yes"); // 第一画面作成 gamen1 g = new gamen1(map); } } |
(上記、< > ¥は、本当は半角です)
赤字は、複数画面出力のためのポイントです
以下の行
map.put("dispose","yes");
をコメントにすると(上記の例)2つ(以上)の画面が同時に出せます。
もし、コメントをはずすと、画面は1つしか出ません
(次の画面を出すとき、前の画面を削除します)
●第一画面は、こんなかんじ(gamen1.java)
import org.eclipse.swt.*; import org.eclipse.swt.widgets.*; import org.eclipse.swt.events.*; import java.util.*; public class gamen1 { // 共通領域 public HashMap map = null; // モデル public Shori shori = null; // 画面項目項目 Display ff; Shell f; Button b1; Button b2; Text t1; int seikai = 0; int phaseNo = 0; int curno = 0; /* * 生成 */ public gamen1(HashMap map) { this.map = map; map.put("gamen1",this); this.shori = (Shori)map.get("shori"); initAppData(); } /* * 表示 */ public void initAppData() { // フレームを作成する ff =(Display)map.get("display"); f = new Shell(ff); 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(); } } // ff.dispose(); } /* * 再描画 */ public void DispAppData() { // 画面間引数を受け取る String rensyu = ""; if ( map != null ) { rensyu = (String)map.get("rensyu"); if (rensyu == null ) rensyu = ""; } // 画面表示 if ( t1 != null ) { t1.setText(rensyu); } } /* * 終了 */ public void freeAppData() { // 2度目にもとってきたときのため、初期化 map.remove("rensyu"); phaseNo = 0; curno = 0; String dis = (String)map.get("dispose"); if ( dis == null ) return; if ( dis.equals("yes") == true ) { f.dispose(); map.remove("gamen1"); } } /* * イベントリスナー */ private class gamen1_HandleEvent extends SelectionAdapter { /* * ボタンが押されたときの処理 */ public void widgetSelected(SelectionEvent e) { Object o = e.getSource(); if ( o.equals(b1)== true) { // 挑戦する System.out.println("挑戦する"); //======================// // 内容の取得 // //======================// map.put("rensyu",t1.getText()); //======================// // 処理 // //======================// if ( shori == null ) return; shori.shori1(); //======================// // 次の画面処理 // //======================// phaseNo = 1; curno = 1; DispAppData(); return; } if ( o.equals(b2)== true) { // 打ち終わった! //======================// // 内容の取得 // //======================// map.put("rensyu",t1.getText()); //======================// // 処理 // //======================// if ( shori == null ) return; shori.shori2(); //======================// // 次の画面処理 // //======================// // 先に消す freeAppData(); // 第二画面表示 gamen2 g2 = (gamen2)map.get("gamen2"); if ( g2 == null ) { g2 = new gamen2(map); } else { // 再描画 g2.DispAppData(); } } } } } |
(上記、< > ¥は、本当は半角です)
前回の1つの画面表示のケースと違うところは、赤色にしてあります。
●第二画面は、こんなかんじ(gamen2.java)
import org.eclipse.swt.*; import org.eclipse.swt.widgets.*; import org.eclipse.swt.events.*; import java.util.*; public class gamen2 { // 共通領域 public HashMap map = null; // モデル public Shori shori=null; // 画面項目項目 Display ff; Shell f; Label l1; Label l2; Button b1; Button b2; /* * 生成 */ public gamen2(HashMap map) { this.map = map; map.put("gamen2",this); this.shori = (Shori)map.get("shori"); initAppData(); } /* * 表示 */ public void initAppData() { // フレームを作成する ff =(Display)map.get("display"); f = new Shell(ff); f.setText("test"); f.setSize(240,320); f.setLayout(null); // アクションを作成する gamen2_HandleEvent al = new gamen2_HandleEvent(); // ラベル l1 = new Label(f,SWT.NULL); l1.setLocation(10,30); l1.setSize(220,30); l2 = new Label(f,SWT.NULL); l2.setLocation(10,120); l2.setSize(220,30); // ボタン作成 b1 = new Button(f,SWT.NULL); b1.setText("再挑戦する"); b1.setLocation(10,250); b1.setSize(100,30); b1.addSelectionListener(al); // ボタン作成 b2 = new Button(f,SWT.NULL); b2.setText("終了"); b2.setLocation(130,250); b2.setSize(100,30); b2.addSelectionListener(al); // 表示 f.open(); DispAppData(); // ウィンドウが破棄されるまでループ while (f.isDisposed() == false) { if (ff.readAndDispatch() == false) { ff.sleep(); } } // ff.dispose(); } /* * 終了 */ public void freeAppData() { String dis = (String)map.get("dispose"); if ( dis == null ) return; if ( dis.equals("yes") == true ) { f.dispose(); map.remove("gamen2"); } } /* * 再描画 */ public void DispAppData() { // 画面間引数を受け取る String username = ""; String sei_ritu = ""; String byo = ""; if ( map != null ) { username = (String)map.get("username"); if ( username == null ) username = ""; sei_ritu = (String)map.get("sei_ritu"); if ( sei_ritu == null ) sei_ritu = ""; byo = (String)map.get("byo"); if ( byo == null ) byo = ""; } // 画面表示 if ( l1 != null ) { l1.setText(username + "さんの結果"); } if ( l2 != null ) { l2.setText("正解率"+sei_ritu+"%"+"時間"+byo+"秒"); } } /* * イベントリスナー */ private class gamen2_HandleEvent extends SelectionAdapter { /* * ボタンが押されたときの処理 */ public void widgetSelected(SelectionEvent e) { Object o = e.getSource(); if ( o.equals(b1)== true) { // 挑戦する System.out.println("再挑戦する"); // 消す freeAppData(); // 第一画面表示 gamen1 g1 = (gamen1)map.get("gamen1"); if ( g1 == null ) { g1 = new gamen1(map); } else { g1.DispAppData(); } return; } if ( o.equals(b2)== true) { // 打ち終わった! ff.dispose(); System.exit(0); } } } } |
(上記、< > ¥は、本当は半角です)
赤字は、複数画面のためのポイントです。
これで、SWTも複数画面が出ました。
めでたしめでたし。
ということで、SWTのお話もここでおしまいです。