Java 使用线程等待用户选择文件
我有一个Java的mainClass,它在swing中启动GUI。我要求用户使用JFileChooser打开一个文件。我希望main等待用户完成拾取文件,然后继续main中的其余代码。如何使用线程执行此操作?提前谢谢 以下是基本代码: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
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
显示一个模式对话框,这意味着在用户关闭它之前,代码将在该点阻塞…问题的措辞让我感到困惑。你真的想使用一个单独的线程来等待用户做出选择(不确定这将如何工作),还是想在选择文件后使用一个单独的线程来做一些事情?这很微妙,但很重要。