2011-07-27 39 views
1

我不是SWT用戶,但我需要它在JApplet中的功能之一我正在處理:FileDialog。當我用瀏覽器運行小程序時,我遇到了問題:對話框不會彈出,不會拋出異常,也不會發生任何(但閃爍的窗口)。在Applet中的SWT FileDialog不顯示

Applet僅適用於Windows用戶,這是要求。

當我在Eclipse中從appletviewer運行相同的applet時,它工作正常。

我將所有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中(窗口中的%PATH%)

你有什麼建議嗎?

順便說一句:與本機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

可以爲用戶提供與反應的按鈕可運行Applet的例子對話框打開? – Sorceror

+0

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

回答

0

「不會拋出異常,也不做(但窗口的閃爍)發生」 SWT平時寫的,而不是在顯示問題的情況下拋出異常(在通常情況下)日誌文件。我不太瞭解基於SWT的applet,但我想知道,在這種情況下是否有任何日誌文件?

+0

控制檯中沒有顯示任何內容,沒有未捕獲的異常,沒有任何內容。什麼都沒發生。我期望一些動態庫加載錯誤或安全性(applet已簽名) - 沒有任何反應。這很奇怪。在非示例代碼中,設置了log4j。 – Kolorobot

1

如果您想在applet中創建對話框,您必須找到父框架。我就遇到了這個問題,最近也發現這個有用: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(); 
    } 
} 

這將讓你父框架,你傳遞給對話框的構造函數:

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

注意,某些瀏覽器可能會阻止這是一個彈出窗口。

1

如果您使用的是Java SE 6u26,你可能會運行到Bug 7056092 - 更新到Java SE 6u27固定的文件對話框不是在SWT應用程序爲我打開問題