使用线程等待用户选择文件

时间:2014-11-14 00:43:18

标签: java multithreading swing jfilechooser

我在Java中有一个mainClass,可以在swing中启动GUI。我要求用户使用JFileChooser打开文件。我希望main等待用户完成选择文件,然后继续使用main中的其余代码。我如何使用线程执行此操作?提前谢谢。

这是骨架代码:

public class MainClass {
    public static void main(String[] args) {

        GUI gui= new GUI();
        //wait for user input here

        //Continue with code
        System.out.println("User has picked a file");
    }
}

GUI.java

public class GUI{
   //User picks file using JFileChooser
   JFileChooser chooseFile= new JFileChooser();
   //Notify mainclass we're done with fiction to continue with code
}

1 个答案:

答案 0 :(得分:2)

好的,有两件事。

您不需要多个线程

问题是,您只需使用“模态”对话框即可实现等待用户选择文件的目标。这类似于以下内容:

import javax.swing.*;

public class DialogTest {

    public static void main(String[] args) {
        JFileChooser chooser = new JFileChooser();
        chooser.showOpenDialog(null);
        System.out.println("File chooser is now closed. File is: " + 
                chooser.getSelectedFile().toString());

    }
}

在用户选择文件,单击取消或单击X之前,showOpenDialog方法不会返回。请注意,如果用户取消,getSelectedFile()将返回null。

如果你确实需要线程(你知道其他的话)

Swing使用它所谓的Event Dispatch Thread。如评论中所述,Swing不是线程安全的。这意味着对Swing组件的任何和所有方法调用都应该从EDT完成。您可以使用SwingUtilities.invokeLater(Runnable)计划在EDT上运行的代码。您可以使用Swing Worker计划在后台线程(使用线程池)中运行某些内容。您的大多数代码可能只在EDT上运行。可以使用swing worker将长时间运行的操作发送到后台线程。