ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

Javaの画面表示-その13:SWTによる画面表示(その3:複数画面を表示する場合)

2006-10-26 18:46:48 | JavaとWeb

 シリーズ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のお話もここでおしまいです。
この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 仕様書からプログラムソース... | トップ | ソフトバンクの予想外割のま... »
最新の画像もっと見る

JavaとWeb」カテゴリの最新記事