- PR -

JAVAアプレットからブラウザの終了

1
投稿者投稿内容
JA6JVX
会議室デビュー日: 2002/12/05
投稿数: 2
投稿日時: 2002-12-17 17:16
題記の方法についてご存知の方、ご教授頂きたい。

JAVAアプレットのJFrameを使ったWEBアプリケーションを作成しております。
アプリケーションのメニューに"終了"を付け終了させたいと思い
System.exit(0)
としたところセキュリティエラーが出力されます。
どのようにすれば終了させることができるのでしょうか。

(JAVAのアプリケーション作成経験ないため参考書を見ながら日夜格闘しております。
SUNのJAVAページは今ひとつどのように見ればよいのか分かりません。
よろしければJAVAのページの見方についても教えて頂けると助かります。)


以下はフレームの"X"ボタンで終了させようとしたソースです。(抜粋)
(最終的には"X"と"終了"メニューのどちらでも終了できるようにしたい)
コンパイルは通りますが、動作させ"X"ボタンを押すとエラーとなります。


[アプレットの呼び出し方法]
<APPLET
CODE="DR.class"
codebase = "."
width="300" height="55"
name = "DR"
align = left
vspace = 0 hspace = 10>
<PARAM NAME=archive VALUE="DR.jar">
</APPLET>

[アプレットクラス]
public class DR extends JApplet implements ActionListener{
AppFrame mainwin = new AppFrame("Title");
mainwin.setVisible(true);
}

[フレームクラス]
class AppFrame extends JFrame{
public AppFrame(String title){
super(title);

this.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
this.addWindowListener(
new java.awt.event.WindowAdapter(){
public void windowClosing(WindowEvent e){
// this_windowClosing(e);
System.exit(0);
}
}
);
}
}



環境
OS:Windows2000
JDK:1.2.2
小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2002-12-18 13:04
Javaアプレットってサンドボックスっていう概念の元、外界(ユーザー環境)を
操作することに制限をかけているから、アプレット自身を動かしている環境を
終了させることって出来ないんじゃないですかねー。表示するHTMLを切り替えて、
JavaScriptと連携するとかしないと出来ないような気がするっす。
未記入
ぬし
会議室デビュー日: 2002/03/28
投稿数: 255
投稿日時: 2002-12-18 17:10
>Javaアプレットってサンドボックスっていう概念の元、外界(ユーザー環境)を
>操作することに制限をかけているから、アプレット自身を動かしている環境を
>終了させることって出来ないんじゃないですかねー。表示するHTMLを切り替えて、
できるとすればsigned applet(署名付きアプレット)の場合に限るでしょう.
やったことはないので,本当にできるかどうか知らないけど.
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2002-12-18 17:32
unibon です。こんにちわ。

引用:

JA6JVXさんの書き込み (2002-12-17 17:16) より:
this.addWindowListener(
new java.awt.event.WindowAdapter(){
public void windowClosing(WindowEvent e){
// this_windowClosing(e);
System.exit(0);
}
}
);



Java の環境にもよるのかもしれませんが、
複数のブラウザウィンドウでひとつの Java VM を
共有していた場合もあると思います(ちょっとあやふや)。
したがって Java のフレームを終わる(閉じる)ために System.exit すると、
もし、他のウィンドウでも Java VM を使っていると、
その上で動いている別のアプレットも道連れになってしまいますし、
そもそも Java アプレットのデフォルトのセキュリティの制約があるため、
System.exit することを考えるべきではないでしょう。

理想的な、Java アプレットの終わり方としては、
Frame を dispose しその他必要に応じて変数も null にして、
到達可能(というんでしたっけ?)なインスタンスがないようにして、
あとはガーベッジコレクションに任せる、という立場にすべきでしょう。

ただ、これがなかなか難しいです。
使い終わったリソースをすべて解放することは容易ではありません。
なぜか残ってしまうことが多々あります。
最低限 Frame (やその他 dispose できるもの)を dispose すればそれで良し、
と割り切ってもよいかもしれません。



以下、追加:
件名を見ていませんでした(汗)。
ブラウザのウィンドウを閉じたい、ということなんですね。
Java アプレットと JavaScript の間で何らかの通信をおこなって、
JavaScript の側でウィンドウを閉じることをおこなえばできそうな気もしますが、
よく知らないです。
「通信」が結構面倒かもしれませんが、
いざとなったらブラウザのステータスバーの文字列を共有してやりとりする、
などを考えたことはありますが、試したことはありません。


[ メッセージ編集済み 編集者: unibon 編集日時 2002-12-18 17:37 ]
pon
常連さん
会議室デビュー日: 2002/05/21
投稿数: 43
投稿日時: 2002-12-18 17:47
引用:

ブラウザのウィンドウを閉じたい、ということなんですね。
Java アプレットと JavaScript の間で何らかの通信をおこなって、
JavaScript の側でウィンドウを閉じることをおこなえばできそうな気もしますが、
よく知らないです。
「通信」が結構面倒かもしれませんが、
いざとなったらブラウザのステータスバーの文字列を共有してやりとりする、
などを考えたことはありますが、試したことはありません。



JavaScriptの場合セキュリティ上の観点からスクリプトで開けたウィンドウ以外は
警告のダイアログが出ます。それをよしとするユーザーは少ないかと。
アプレットは基本的にクライアントのものは操作できないと考えたほうが、
代替案を思いつきやすいのでは?
JA6JVX
会議室デビュー日: 2002/12/05
投稿数: 2
投稿日時: 2002-12-18 18:15
小僧様、悪夢を統べるもの様、unibon様、pon様
ご教授ありがとうございます。

結果からいいますと、
window.top.close();
を記述したHTMLを用意し"x"ボタンが押された時に
このページに移動することで出来ました。
(ページ移動の方法と呼出し方でかなり悩みました)

JAVAとJAVAスクリプトの連携を考えつかずJAVAで何とかしようと
していたのが情けないです。


以下はソースコード(抜粋)です。
追加場所は"#"の行と終了用のHTMLです。


[アプレットの呼び出し方法]
<APPLET
CODE="DR.class"
codebase = "."
width="300" height="55"
name = "DR"
align = left
vspace = 0 hspace = 10>
<PARAM NAME=archive VALUE="DR.jar">
</APPLET>

[アプレットクラス]
#import java.net.*;
public class DR extends JApplet implements ActionListener{
public void init(){
AppFrame mainwin = new AppFrame("Title"){
#void this_windowClosing(WindowEvent e){appletClose();}
};

mainwin.setVisible(true);
}

#private void appletClose(){
#try{
#URL newURL = new URL(getDocumentBase(),"end.html");
#getAppletContext().showDocument(newURL,"_self");
#}catch(MalformedURLException er){}
#}

}


[フレームクラス]
class AppFrame extends JFrame{
public AppFrame(String title){
super(title);

this.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
this.addWindowListener(
new java.awt.event.WindowAdapter(){
public void windowClosing(WindowEvent e){
this_windowClosing(e);
}
}
);
}

void this_windowClosing(WindowEvent e){
this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}

}


[終了用HTML]
<HTML>
<SCRIPT type='text/javascript'>
function windowclose() {
window.top.close();
}
</SCRIPT>
<BODY onload="windowclose()">
</BODY>
</HTML>
1

スキルアップ/キャリアアップ(JOB@IT)