Web appletとローカルマシン実行用ソースを同時進行で作るためのテンプレートを作る

  • 最小構成
    • 実行プログラム(パッケージ、もしくは複数のパッケージの組み合わせ)
    • 実行プログラムを起動するボタンを有するアプレットクラス(ただし、アプリケーションとして実行することも可能とする)
    • アプレットクラスを記載したhtml文書
  • 構成の原理
    • アプレットとして立ち上げるためのクラス(extends Applet)を作成するが、そのクラスにmain関数を書き込んでおく
    • main関数を持ったAppletクラスはアプリケーションとして起動可能となる
    • Appletクラスがmain()を通じてアプリケーションとして立ち上がる場合と、アプレットとしてinit()->start()->action()として動く場合とで、同じ機能が「ブラウザ上(経由)」「フレーム上」の両方で行われるために次のようにする
    • Appletクラスのmain()は、Appletクラスのオブジェクトを作成し、そのオブジェクトに対してinit(), start()関数を実行させる
    • こうすることで、アプリケーションとして動き始めた場合の動きがアプレットとして動き始めたときの動きに合流する
  • 作成の実際
    • Eclipseを使用(Eclipse最高! - ryamadaのコンピュータ・数学メモ)
      • Eclipseにて新規プロジェクト(AppletApplication)を作成する
      • AppletApplicationに
        • 実行プログラムのパッケージ(run)を置く
        • アプレットクラス(AppApplet.class)を有するパッケージ(appletAppli)を作成する
        • これらパッケージと並列(プロジェクトの直下)にAppApplet.classを起動するhtml文書(ApAppli.html)を作成する
  • 実行プログラムパッケージRunの構成
    • main関数を有し、単体として動作確認がとれている
    • アプレット・アプリケーションの両方で動かすために次の条件を満たす
      • アプレットとして動かす場合にも、Runの実行に伴うウィンドウ上での入出力に限定する
      • 入出力のうち、Runが立ち上げるウィンドウからの操作により、ローカルマシン・ネット上マシンのファイルシステム・データベースとの入出力についても、上述の条件を満たすことで実現する
  • 添付の図は、(1)左上、(2)右、(3)左下、の順に、Eclipseから、(1)HTML文書をブラウザで開き、それが呼び出したAppApplet.classがinit()により表示したStartボタンをクリックして、空のフレームを立ち上げた図、(2)Eclipseから、AppApplet.classをアプリケーションとして立ち上げて、そのStartボタンを押して空のフレームを立ち上げた図、(3)Eclipseから、AppApplet.classを「アプレットとして起動」させ、「Javaアプレットウィンドウ」にできた「init()作ったボタン」を押すことで空のフレームを立ち上げた図、の3種類である。
  • 使用した3ソース
    • ApAppli.html
<HTML>
	<HEAD><TITLE>ApAppli</TITLE></HEAD>
	<BODY>
		<APPLET CODE = "appletAppli.AppApplet.class" CODEBASE = "."
		WIDTH = "400" HEIGHT = "400">
		</APPLET>
	</BODY>
</HTML>
    • タグ内で指定された CODE = "appletAppli.AppApplet.class"が、パッケージappletAppliのAppAppletクラスを呼び出すことを指示している。

この呼び出しは、WIDTH = "400" HEIGHT = "400" のサイズでブラウザ上に表示され、クリッカブルである。

    • AppApplet.class
package appletAppli;
/*
 * アプレットとして機能するためにインポートする諸群
 */
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;

/*
 * 実行プログラムを有するクラス"run"をインポート
 */
import run.*;
/*
 * 3構成要素
 * (1) init関数:これによりアプレットとして起動可能
 * (2) main関数(メソッド):これによりこのクラスをアプリケーションとして起動することが可能
 * (3) action関数:init関数のボタンに応じて実行する内容を定義
 */
public class AppApplet extends Applet{
	//アプレットとして直接起動するときには、以下のinit()をStartボタンのみで実行
	//アプリケーションとして起動するときには、以下のmain()内でisApp_=trueとされるので、
	//Start,Exitの2ボタンで実行する
	//この2点以外に違いはない

	private boolean isApp_ = false;

	public void init(){
		
		if(isApp_)
		{
			setLayout(new GridLayout(2,1));
			add(new Button("Start"));
			add(new Button("Exit"));
		}
		else
		{
			setLayout(new GridLayout(1,1));
			add(new Button("Start"));
		}

		validate();
		show();
	}
	
	public static void main(String arg[]){
		//アプリケーションとして起動するときには
		//アプレットのときのように初期ブラウザ画面ができないので、Frameを作成する
		//その上で、アプレットのinit()を開始し、start()により、アプレットのときと同じ動きをさせる
		//ただし、アプレットの場合とアプリケーションの場合とで、
		//表示内容(アプレットでのブラウザ表示に対し、アプリケーションでのフレーム表示)
		//を変えたい場合には、apl.isApp_をmain()経由のときには、trueに
		//アプレットでinit()を直接起動するときにはfalseにすることで、実現している
		Frame frame = new Frame("frame_name");
		AppApplet apl = new AppApplet();
		apl.isApp_ = true;
		apl.init();
		apl.start();
		
		frame.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
	
		frame.add("Center", apl);
		frame.resize(300, 300);
		frame.validate();
		frame.show();
	}
	public boolean action(Event event, Object what)
	{
	//init()がstart()され、できたボタンにはinit()で定義されているように
	//Exitもしくは、Startの文字列が記されている
	//この文字列を参照して、それぞれのボタンがクリックされたときの実行内容を定義している
	//アプレットの場合も、アプリケーションの場合もStart文字列を有するボタンがあるので
	//そのボタンがクリックされたときの実行内容が共通になっている
	//この場合は、runパッケージのMainクラスのmain関数をstaticに呼び出して実行している
	//run.Main.classは通常、単体で作成するときには、main関数を、main(String args[])で書くことが多いので
	//ここでは、元のrun.Mainを書き換えなくてよいように、空のString変数を使用している
		if(event.target instanceof Button)
		if(((String)what).equals("Exit"))
		{
			System.exit(0);
		}
		else if(((String)what).equals("Start"))
		{
			String st[];
			st = new String[0];
			run.Main.main(st);
		}

		return super.action(event, what);
	}
}
    • run.Main.class
      • 最後に実行プログラムのクラスも念のため記すが、これは、冒頭に記載した条件を満たしていればなんでもよい。
      • ここでは、空のフレームを立ち上げるだけの内容とする
package run;

import java.awt.Frame;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Main {

	public static void main(String[] args) {
		Frame frame = new Frame("frame_name");
		
		frame.addWindowListener(new WindowAdapter(){
	   		public void windowClosing(WindowEvent e){
	   			System.exit(0);
	   		}
	   	});
	   
	   
	   try {
	   	UIManager.setLookAndFeel(
	   			"com.sun.java.swing.plaf.motif.MotifLookAndFeel");
	   	SwingUtilities.updateComponentTreeUI(frame);
	   	
	   } catch (Exception e){
	   	
	   }
	   
	   frame.setSize(350,100);
	   frame.setVisible(true);
	}
}