java - 如何在 JavaFX 应用程序的后台运行 Thread?
问题描述
我正在用 Java (JavaFX) 编写一个类似于 windows 文件资源管理器的应用程序。该程序仅用于练习(这是我的第一个应用程序)。它是一个 GUI 应用程序,您可以在其中创建/修改/删除文件和文件夹。
有一些按钮负责发送用户操作。FileManagerController 类是主窗口的控制器类。我想添加一个功能以在后台使用当前目录中的所有文件刷新 ListView。现在它仅在用户执行任何操作时刷新它。这是这个应用程序的外观。
解决方案
这里有一篇很好的文章:https ://docs.oracle.com/javafx/2/threads/jfxpub-threads.htm
亮点是“Java FX”方式是通过使用Task和Service。
您创建一个任务,该任务具有多种生命周期管理方法等,并将其提交给服务执行。该服务将与线程或执行器服务一起使用。
您想使用任务,因为它是特定于 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();
推荐阅读
- javascript - 如何在底部选项卡导航器反应导航中卸载非活动屏幕?
- terraform - 无法在 Terraform 中执行目标删除
- java - 对象的浅拷贝未正确更新原始对象
- python - Behat for Python 有哪些替代品?
- python - 如何通过每列的不同条件突出显示数据框中的某些单元格?是否也可以突出显示系列中的某些数字?
- java - 在 Spring REST api 中从 MySQL 实现存储过程时,“ParameterMode 无法解析为变量”
- python - 如何将两个列表中的元素组合成一个列表中的一个元素?
- matlab - Findpeaks坐标与X轴坐标不匹配(Matlab)
- r - 使用 sapply 将列转换为 posixct 并在 R 中保持日期时间格式
- python - 避免 RLE 算法中的 Python 错误