2012-03-09 9 views
1

Webページのファイルを開くダイアログをポップアップし、ユーザーにファイルを選択させる必要があります(アップロード用ではありません)。完全なファイルパスにアクセスする必要があるため、フォーム/入力は使用できません。したがって、私は署名されたJavaアプレットを使用します。Safariが(アイドル)JFileChooserを起動したJavaアプレットを終了します

私のテストケースでは、Javaアプレットのメソッドがjavascript関数から呼び出されます。アプレットメソッドは、ファイルを開くダイアログ(JFileChooser)を開きます。約アイドル状態のままにしておくとSafari(*)によってアプレットが殺されてしまいました。私のテストでChromeがうまくいけば、「応答しない」アラートがポップアップしますが、Firefoxは明らかに気にしません。

IIUC、これはSafari固有です私はJFileChooserのスレッディングを見ていましたが、そのパスはもっと複雑に思えますし、Javascriptだけですべての作業を行うことはできませんでした。しかし、これは非常に不便です。既知のセキュリティ上の理由から。あなたがこれまできれいな解決策を持っていますか?

(*)JVMがInterruptedExceptionあるに終わる

+0

はコールバックでそれを実装することができない:Javaで一方

function showFileDialog() { applet.showFileDialog(function(filepath) { if(filepath) { alert("Hey they picked " + filepath); } // must have hit cancel if filepath is null }); } 

をモーダルダイアログ "?これは、モーダルのような(例えば、常時オンの)ダイアログでもあります。 JavaScriptがメインイベントポンプに戻るようにする必要があります。 –

+0

詳細を教えてください。 –

+0

* "私のテストケースでは、JavaアプレットメソッドがJavaScript関数から呼び出されています" *おそらくブラウザーはJSが完了するのに時間がかかりすぎることに気づいているので、それが原因です。その場合、解決策は、アプレットがスクリプトを完了した後に呼び出すことです。そうすれば、スクリプトは 'ブラウザをブロックする'のままになることはありません。 –

答えて

0

あなたの問題は、そのメソッドの呼び出しをブロックするように動作するJavaでのダイアログが(その実際の事実に由来します私は他のツールキットを採用したいと思っています。だからあなたのJavaScriptがメソッドをJavaコードに呼び出すと、そのダイアログが閉じられるのを待っています。ブラウザは、JavaScriptスレッドがしばらくの間返ってこなかったことを検出し、単にデッドロックされていると判断し、それを殺すと判断します。そのため、Javaアプレットはページと共にダウンします。

これを非同期式のやりとりに移行する必要があります。 Javascriptの呼び出しはすぐに返されます。 JavaでSwingUtilities.invokeLater()を使用して、その呼び出しをJavascript呼び出しスレッドからプッシュすることができます。そのトリックは、ダイアログが閉じられると、Javascriptを呼び出すためにJavaが必要になります。だから、javascriptにある種のコールバックメカニズムを登録させるでしょう。次のようなもの私はどのように外部のJavaScriptを思い出すことができない - > Javaは正確に動作しますので、これはアイデア例証するだけの擬似コードである:「

public void showFileDialog(JavascriptFunction someJavascriptFunction) { 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      JFileChooserDialog chooser = new JFileChooser(); 
      ... 
      int option = chooser.showOpenDialog(parent); 

      someJavascriptFunction.invoke(option == JFileChooser.APPROVE_OPTION ? 
              chooser.getSelectedFile().getAbsolutePath() : 
              null); 
     } 
    }); 
} 
+0

ああ、私がJDialogsをブロックすることで完全に実装されたアプリで作業していた苦痛...私は別のツールキットでこれを望むかどうか分からない。 ;) –

+0

@chubbardコードスニペットをありがとう、彼らは正しい方向に私を得た。署名されたアプレットが含まれていますが、基本的には上記のようになっているため、完全なソリューションはやや精巧です。 –

関連する問題