Applet中的SWT FileDialog不会显示

时间:2011-07-27 11:04:56

标签: java swing swt

我不是SWT用户,但我需要在JApplet中使用它的一个功能:FileDialog。当我使用浏览器运行applet时我遇到了问题:对话框不会弹出,也不会抛出异常,没有任何东西(但窗口闪烁)。

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中(Windows中的%PATH%)

你有什么建议吗?

BTW:使用原生L& F摇摆不是一种选择。我需要原生文件选择对话框。

这是我创建的可运行的演示applet。它需要: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);
                }
            });
        }
    }
}

3 个答案:

答案 0 :(得分: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 :(得分:1)

如果您使用的是Java SE 6u26,则可能会遇到Bug 7056092 - 更新到Java SE 6u27修复了无法在SWT应用中打开的文件对话框问题

答案 2 :(得分:0)

“没有抛出异常,没有任何东西(但窗口闪烁)” SWT通常会编写日志文件,而不是在出现显示问题时抛出异常(一般情况下)。我对基于SWT的小程序了解不多,但我想知道,在这种情况下是否有任何日志文件?