我不是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);
}
});
}
}
}
答案 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的小程序了解不多,但我想知道,在这种情况下是否有任何日志文件?