大家好。
我正在用Java编写一个方法打开文件对话框让用户选择文件,我试图使用SWT,因为我想要文件对话框UI看起来像系统文件对话框UI(在Windows 7中,JFileChooser的文件对话框UI退出不同于系统文件对话框UI)。
它工作正常,直到我从文件对话框拖动文件,当我将文件拖入应用程序时它停止没有任何错误消息,永远不会恢复,我尝试了很多次后,我注意到如果我不将JTextField添加到UI中这个问题不会发生,但是停止使用JTextField似乎不是解决方案,有没有人知道如何解决这个问题?我使用的是swt-4.5 -win32-win32-x86和JDK1.8.0_91。
这是关于这个问题的示例代码:
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Shell;
public class FileDialogExample extends JFrame {
public FileDialogExample() {
super();
setSize(new Dimension(400, 130));
setResizable(false);
}
public static void main(final String[] args){
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (UnsupportedLookAndFeelException e) {
e.printStackTrace();
}
JFrame.setDefaultLookAndFeelDecorated(true);
FileDialogExample controlFrame = new FileDialogExample();
controlFrame.setTitle("FileDialogExample");
controlFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
controlFrame.getContentPane().add(initUI());
controlFrame.setLocationRelativeTo(null);
controlFrame.setVisible(true);
}
public static JPanel initUI() {
JPanel ret = new JPanel();
JButton openFileDialog = new JButton("Open file");
openFileDialog.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
Display display = new Display ();
Shell shell = new Shell (display);
// Don't show the shell.
// shell.open ();
FileDialog fd = new FileDialog(shell, SWT.OPEN);
fd.setText("Open");
fd.setFilterPath("C:/");
String selected = fd.open();
System.out.println(selected);
shell.close();
while (!shell.isDisposed ()) {
if (!display.readAndDispatch ()) display.sleep ();
}
display.dispose ();
}
});
ret.add(openFileDialog);
JTextField textField = new JTextField("TextField");
ret.add(textField); // Add textField into panel would cause drag in error.
return ret;
}
}
答案 0 :(得分:0)
使用Text而不是JTextField。如果您使用SWT,那么您应该使用SWT的所有控件。 SWT中的Swing控件可能会抛出异常,这可能是应用挂起的原因。