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

Java 使用线程等待用户选择文件,java,multithreading,swing,jfilechooser,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 her

我有一个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
}
好的,两件事

您不需要多个线程 问题是,您可以通过使用模式对话框来完成等待用户选择文件的目标。其工作原理如下所示:

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());

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

如果您确实需要线程(您知道,用于其他用途)
Swing使用它所称的。正如评论中提到的,Swing不是线程安全的。这意味着对Swing组件的任何和所有方法调用都应该从EDT完成。您可以使用
SwingUtilities.invokeLater(Runnable)
计划在EDT上运行代码。您可以通过使用线程调度在后台线程中运行(使用线程池)。大部分代码可能只在EDT上运行。长时间运行的操作可以使用swing Worker发送到后台线程。

简短回答,不要。Swing不是线程安全的,这意味着您应该只在事件调度线程的上下文中对UI进行更新。有关模式详细信息,请参阅
JFileChooser
显示一个模式对话框,这意味着在用户关闭它之前,代码将在该点阻塞…问题的措辞让我感到困惑。你真的想使用一个单独的线程来等待用户做出选择(不确定这将如何工作),还是想在选择文件后使用一个单独的线程来做一些事情?这很微妙,但很重要。