2011-07-27 11 views
1

私はSWTユーザーではありませんが、私が取り組んでいるJAppletの機能の1つが必要です:FileDialog。そして、ブラウザを使ってアプレットを実行すると問題が発生します。ダイアログはポップアップされず、例外もスローされず、何も表示されません(ウィンドウの点滅)。アプレット内のSWT FileDialogが表示されません

アプレットはWindowsユーザーのみの要件です。

Eclipseのアプレットビューアから同じアプレットを実行すると、正常に動作します。

すべてのSWTライブラリをWindowsのPATHに追加しました。そのため、VMで使用できるようにする必要があります。私はインターネットで検索しましたが、私を助けるものは何も見つかりませんでした。

私が使用していますコード:

final Display display = new Display(); 
    final java.awt.Canvas awtParent = new java.awt.Canvas(); 

    applet.getApplet().add(awtParent); 

    final Shell swtParent = SWT_AWT.new_Shell(display, awtParent); 
    try { 
     FileDialog dialog = new FileDialog(swtParent, SWT.OPEN); 
     dialog.setFilterExtensions(getMediaFilesExtensions()); 
     dialog.setFilterNames(new String[] {"All files", "Media Files"}); 
     String fileName = dialog.open(); 
     File[] files = null; 
     if (fileName != null) { 
      files = new File[] { new File(dialog.getFileName()) }; 
     } 
     return files; 
    } finally {   
     display.syncExec(new Runnable() { 
      public void run() { 
       if (swtParent != null && !swtParent.isDisposed()) swtParent.dispose();      
       display.dispose(); 
       applet.getApplet().remove(awtParent); 
      } 
     }); 
    } 

をユーザーがボタンをクリックしながら、このコードが呼び出されます。残りのアプリケーションはSwingベースです。

私はSWT 3.7.1でWindows 7で動作します。すべてのDLLはjava.library.pathにあります(Windowsでは%PATH%)

あなたはアドバイスをお持ちですか?

BTW:ネイティブのスイングL & Fはオプションではありません。ネイティブのファイル選択ダイアログが必要です。

これは私が作成した実行可能なデモアプレットです。 swt-win32-x86-3.7.jarが必要です。

package com.applet; 

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.io.File; 
import java.util.Arrays; 

import javax.swing.*; 

import org.eclipse.swt.SWT; 
import org.eclipse.swt.awt.SWT_AWT; 
import org.eclipse.swt.widgets.*; 

public class DemoApplet extends JApplet { 
    @Override 
    public void init() { 
     JPanel mainPanel = new JPanel(); 
     JButton button = new JButton(new AbstractAction("Select files") { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       File[] filesNative = getFilesNative(); 
       String msg = "Selected files: " + Arrays.toString(filesNative); 
       JOptionPane.showMessageDialog(null, msg); 
      } 
     }); 
     mainPanel.add(button, BorderLayout.CENTER); 
     add(mainPanel); 
     super.init(); 
    } 

    private File[] getFilesNative() { 
     final Display display = new Display(); 
     final java.awt.Canvas awtParent = new java.awt.Canvas(); 

     add(awtParent); 

     final Shell swtParent = SWT_AWT.new_Shell(display, awtParent); 
     try { 
      FileDialog dialog = new FileDialog(swtParent, SWT.OPEN); 
      dialog.setFilterNames(new String[] {"All files", "Media Files"}); 
      String fileName = dialog.open(); 
      File[] files = null; 
      if (fileName != null) { 
       files = new File[] { new File(dialog.getFileName()) }; 
      } 
      return files; 
     } finally {   
      display.syncExec(new Runnable() { 
       public void run() { 
        if (swtParent != null && !swtParent.isDisposed()) swtParent.dispose();      
        display.dispose(); 
        remove(awtParent); 
       } 
      }); 
     } 
    } 
} 
+0

私のためにSWTのアプリで開いていないファイルダイアログの問題は、あなたと反応するボタンで実行可能なアプレットの例を提供することができ、固定しましたダイアログが開きますか? – Sorceror

+0

http://www.eclipse.org/swt/jws/controlexample.jnlp –

答えて

0

は SWTは通常、代わりに(一般的に)表示問題が発生した場合に例外をスローするログファイルを作成する「例外がスローされない、何も(しかし、ウィンドウの点滅)が起こりません」。 SWTベースのアプレットについてはあまりよく分かりませんが、この場合はログファイルがありますか?

+0

コンソールには何も表示されず、キャッチされない例外はありません。何も起こりません。私はいくつかの動的ライブラリの読み込みエラーやセキュリティ(アプレットが署名されている)を期待 - 何も起こりません。そしてこれはむしろ奇妙です。例でないコードでは、log4jが設定されています。 – Kolorobot

1

アプレットでダイアログを作成する場合は、親フレームを見つける必要があります。私も最近、この問題に遭遇し、これが有用であることが判明:一部のブラウザでは、ブロックする可能性があることを

FileDialog fd = new FileDialog(findParentFrame(), "Save Building", FileDialog.SAVE); 

注:http://www.jguru.com/faq/view.jsp?EID=27423

public Frame findParentFrame(){ 
    java.awt.Component c = getParent(); 

    while(true) { 
     if(c instanceof Frame) 
      return (Frame)c; 
     c = c.getParent(); 
    } 
} 

これは、あなたがダイアログのコンストラクタに渡す親フレームを、取得しますこれをポップアップとして表示します。

1

あなたがBug 7056092に実行されているかもしれませんが、Java SEの6u26を使用している場合 - Java SE 6u27への更新は

関連する問題