从文件对话框中拖放文件时应用程序停止响应

时间:2016-07-15 04:36:27

标签: java swing dialog swt

大家好。

我正在用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;
        }
    }

1 个答案:

答案 0 :(得分:0)

使用Text而不是JTextField。如果您使用SWT,那么您应该使用SWT的所有控件。 SWT中的Swing控件可能会抛出异常,这可能是应用挂起的原因。