【发布时间】: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);
}
});
}
}
}
【问题讨论】:
-
您能否提供可运行的 Applet 示例,其中包含对对话框打开做出反应的按钮?