【问题标题】:SWT FileDialog in Applet does not show upApplet 中的 SWT FileDialog 不显示
【发布时间】:2011-10-14 04:06:06
【问题描述】:

我不是 SWT 用户,但我需要它在我正在开发的 JApplet 中的一项功能:FileDialog。当我使用浏览器运行小程序时遇到问题:不会弹出对话框,不会抛出异常,没有任何事情(但窗口闪烁)发生。

Applet 仅适用于 Windows 用户,这是要求。

当我在 Eclipse 中从 appletviewer 运行相同的小程序时,它运行良好。

我将所有 SWT 库添加到 Windows 的 PATH 中,因此它们应该可用于 VM。我在 Internet 上进行了搜索,但找不到任何可以帮助我的东西。

我正在使用的代码:

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%)

你有什么建议吗?

顺便说一句:使用原生 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);
                }
            });
        }
    }
}

【问题讨论】:

标签: java swing swt


【解决方案1】:

如果您想在小程序中创建对话框,您必须找到父框架。我最近也遇到了这个问题,发现这很有用: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);

请注意,某些浏览器可能会将其阻止为弹出窗口。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 控制台中什么都没有出现,没有未捕获的异常,什么都没有。什么都没发生。我预计会出现一些动态库加载错误或安全性(小程序已签名) - 没有任何反应。这很奇怪。在非示例代码中设置 log4j。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-05
      • 2016-04-19
      相关资源
      最近更新 更多