首页 > 解决方案 > 如何在 JavaFX 应用程序的后台运行 Thread?

问题描述

我正在用 Java (JavaFX) 编写一个类似于 windows 文件资源管理器的应用程序。该程序仅用于练习(这是我的第一个应用程序)。它是一个 GUI 应用程序,您可以在其中创建/修改/删除文件和文件夹。

有一些按钮负责发送用户操作。FileManagerController 类是主窗口的控制器类。我想添加一个功能以在后台使用当前目录中的所有文件刷新 ListView。现在它仅在用户执行任何操作时刷新它。这是这个应用程序的外观

标签: javamultithreadingjavafx

解决方案


这里有一篇很好的文章:https ://docs.oracle.com/javafx/2/threads/jfxpub-threads.htm

亮点是“Java FX”方式是通过使用TaskService

您创建一个任务,该任务具有多种生命周期管理方法等,并将其提交给服务执行。该服务将与线程或执行器服务一起使用。

您想使用任务,因为它是特定于 FX 的。正如文档中所说:

因为任务是为 JavaFX GUI 应用程序设计的,所以它确保对其公共属性的每次更改以及状态、错误和事件处理程序的更改通知都发生在 JavaFX 应用程序主线程上。

从文章和文档中,这是一个简单的示例:

 public static class FirstLineService extends Service<String> {
     private StringProperty url = new SimpleStringProperty(this, "url");
     public final void setUrl(String value) { url.set(value); }
     public final String getUrl() { return url.get(); }
     public final StringProperty urlProperty() { return url; }

     protected Task createTask() {
         final String _url = getUrl();
         return new Task<String>() {
             protected String call() throws Exception {
                 URL u = new URL(_url);
                 BufferedReader in = new BufferedReader(
                         new InputStreamReader(u.openStream()));
                 String result = in.readLine();
                 in.close();
                 return result;
             }
         };
     }
 }

创建后,您可以使用以下命令调用它:

service.start();

推荐阅读