2011-07-27 42 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应用程序为我打开问题