2009-04-29 6 views
4

は、私がモーダルダイアログを起動するには、次のコードを呼び出す:アプレット内からモーダルダイアログをシミュレートするにはどうすればよいですか? setVisible(true)をオン

private synchronized void startModal() { 
    try { 
    if (SwingUtilities.isEventDispatchThread()) { 
     EventQueue theQueue = getToolkit().getSystemEventQueue(); 
     while (isVisible()) { 
     AWTEvent event = theQueue.getNextEvent(); 
     Object source = event.getSource(); 
     if (event instanceof ActiveEvent) { 
      ((ActiveEvent) event).dispatch(); 
     } else if (source instanceof Component) { 
      ((Component) source).dispatchEvent(event); 
     } else if (source instanceof MenuComponent) { 
      ((MenuComponent) source).dispatchEvent(event); 
     } else { 
      System.err.println("Unable to dispatch: " + event); 
     } 
     } 
    } else { 
     while (isVisible()) { 
     wait(); 
     } 
    } 
    } catch (InterruptedException ignored) { } 
} 

これは、ほとんどのブラウザでちょうど素晴らしい作品。ただし、Windows版のOperaとSafariで、Iは大厄介な例外以下に直面しています:

java.security.AccessControlException: access denied (java.awt.AWTPermission accessEventQueue) 
    at java.security.AccessControlContext.checkPermission(Unknown Source) 
    at java.security.AccessController.checkPermission(Unknown Source) 
    at java.lang.SecurityManager.checkPermission(Unknown Source) 
    at java.lang.SecurityManager.checkAwtEventQueueAccess(Unknown Source) 
    at java.awt.Toolkit.getSystemEventQueue(Unknown Source) 

は、これらのブラウザで偽のモーダルダイアログを生成するための回避策はありますか?

答えて

1

奇妙な実装がない限り(Sun PlugInがIIRC 1.2.2以降にそれを認可していないかぎり)、その許可を与える必要があります。どのバージョンを話していますか?

これは、おそらくディスパッチループにとって最適ではありません。

EDTからisVisibleに電話する必要があります。

一般に、モーダルインターフェイスは厄介です。

モーダルダイアログで何が問題になっていますか?

+1

Java 1.6u13(その他)しかし、状態として、オペラとWindowsブラウザ上のSafariにはどちらも独自のJavaプラグインがあります。 – jsight

+0

モーダルダイアログは実際にはダイアログではないので動作しません。ダイアログを閉じるまで、呼び出しコード(EDT上にある)をブロックするだけです。これを別のアプローチで書き直すこともできますが、2つの奇妙なブラウザのものを書き換えるのではなく、モーダルアプローチを採用することをお勧めします。 – jsight

+0

IIRC、Operaはyee olde "Firefox 2"プラグインを使用しています。これはこれまでと同じように動作するはずです。彼らは本当にFirefox 3/Chromeプラグインの新しいインターフェースで乗り越えなければなりません。デコレーションオフスクリーンなしでダイアログを開くことができます。これがWebStartとPlugInのセキュリティダイアログの機能です(ただし、IIRC、彼らは装飾を残していますが、これはあまり明るくありません)。 –

1

イベントスレッドのイベントを傍受するのではなく、別の方法を使用してもよい場合は、you could use the glass pane to block all input requests

+0

はい、私は元の質問でそれを言及すべきでした。それは "うまくいく"とはいえ、ガラスの上に置かれたときにスイングコントロールの回避策のバグをたくさん公開しています。また、モダリティの問題(イベントを隠すだけでなく、ダイアログが非表示になるまでsetVisible(true)が呼び出し元をハングアップさせる)を完全に解決することもできません。 – jsight

1

Operaに問題がある理由は、Operaにopera.policyという名前の独自のjava.policyファイル(Opera_installation_directory \ classesフォルダの下)がある可能性があるからです。 Operaのインストールでは、私はOperaで許可されていないが、デフォルトのjava.policyファイルで許可されているアクセス許可を見ることができませんでした。

+0

Sun PlugInとWebStartはこの許可を与えます。 –

1

これを動作させるにはアプレットに署名する必要はありませんか?

は、これらすべてのことを行うためのアプレットを許可する方法は、デジタルそれに署名することで、アプレット

に署名します。事実、署名者は「このアプレットは安全です。もしあなたが私を信じるなら、このアプレットを信じることができます。私の署名を通して、署名してから改ざんされていないことが保証されるからです。署名者(通常は小さなダイアログボックス)を信頼するかどうかを尋ねられ、そうであれば、アプレットは完全な権限を持つことができます。信頼が拒否された場合、アプレットは引き続き限られた権限でサンドボックス内で実行されます。

信頼できるアプレットがローカルに起動されたアプリケーションと同じ権限を持つため、アプレットを信頼するかどうかの決定は非常に慎重に行う必要があります。ファイルを読み書きでき、ネットワーク経由でデータを送信できます。

アプレットのセキュリティモデルの詳細については、こちらを参照してください。それには、アプレットの制限の完全なリストが含まれています。

詳細については、アプレットの署名とリンクを紹介していますので、特にこれをお読みください。 Internet Explorer(およびMS JVM)は少し標準的ではありません。何をすべきかの概要についてこれを読んでください。

も、アプレットに署名した後、あなたはまだSecurityExceptionを取得し、場合、特権コードとしてのコードを実行してみてください。

AccessControllerに。doPrivileged(new PrivilegedAction(){ public Object run(){ //セキュリティに敏感な操作をここで実行します。 return null; } });

のJavaDoc:java.security.AccessController

ポリシーファイル

アプレットの追加機能を付与する別の方法は、Sunが紹介記事を持っているかについてのポリシーファイルの使用、であり、具体的には、ここで別の1アプレットの場合ポリシーを使用すると、アプレットを許可するより細かい方法で制御することができます。たとえば、アプレットにローカルファイルシステムへのアクセスを許可することは可能ですが、拒否されたその他の機能は許可されません。ここにその例があります。

ポリシーファイルを使用することの欠点は、それらがローカルファイルシステムに存在することです。そのため、ユーザーは通常は見えなくて内容が分かりにくいファイルを変更する必要があります。

次の例は、ほとんどのアプレット制限を取り消す方法を示しています。権限のいずれかをより具体的にすることができます。 FilePermissionは、選択されたファイルのみに対して、および読み取り専用アクセスで指定できます。各Permissionクラスのjavadocは、可能なことを詳しく説明します。可能な限り最も制限された設定を使用することをお勧めします。特にRuntimePermissionを使用してClassLoaderとSecurityManagersを作成すると、さらに多くのアプレットの制限を回避できます。

grant codeBase "http://geosim.cs.vt.edu/geosim/-" { 
    permission java.io.FilePermission "<<ALL FILES>>", "read, write, execute, delete"; 
    permission java.net.SocketPermission "*", "accept, connect, listen, resolve"; 
    permission java.util.PropertyPermission "*", "read, write"; 
    permission java.lang.RuntimePermission "*"; 
    permission java.awt.AWTPermission "showWindowWithoutWarningBanner"; 
}; 

のJavadoc

のJavaDoc:java.awt.AWTPermission のJavaDoc:java.io.FilePermission のJavaDoc:java.lang.RuntimePermission のJavaDoc:java.net.SocketPermission のJavaDoc:java.utilの。 PropertyPermission

関連する問題