任何做过GUI开发的人都会碰到在非UI线程中进行UI上的更新操作出现的问题。
在Android开发中,可以通过AsyncTask进行线程上的操作和UI的更新,不过通常AsyncTask的终止和再启动有问
题,我们通常使用Thread和Handler来自己实现相关的功能。
而在Swing开发中,我们可以使用SwingUtilities.invokeLater和SwingUtilities.invokeAndWait来做处理,也可以
使用SwingWorker来进行线程上的操作和UI更新。
这个SwingWorker和Android中的AsyncTask也类似,实现了相同的功能。
在JavaFX中,为了解决这样的问题,提供了Task<T>和Service<T>,不过使用Thread包装Task进行启动和使用Service与Task启动没有什么太大的区别。不过Service提供了restart等方法,这样可以很方便的进行refresh等操作。
示例地址:http://www.wingmei.net/examples/exp2/
public class taskexample extends Application {
public void init(Stage primaryStage){
Region veil = new Region();
veil.setStyle("-fx-background-color: rgba(0, 0, 0, 0.4)");
HBox mHbox = new HBox(10);
ProgressIndicator mBar = new ProgressIndicator(0);
mBar.setMaxSize(150, 150);
Label mLabel = new Label("Loading...0%");
mLabel.setFont(new Font(10));
mHbox.getChildren().add(mBar);
mHbox.getChildren().add(mLabel);
Task<Void> progressTask = new Task<Void>(){
@Override
protected void succeeded() {
super.succeeded();
updateMessage("Succeeded");
}
@Override
protected void cancelled() {
super.cancelled();
updateMessage("Cancelled");
}
@Override
protected void failed() {
super.failed();
updateMessage("Failed");
}
@Override
protected Void call() throws Exception {
for(int i = 0; i < 100; i++){
Thread.sleep(50);
updateProgress(i + 1, 100);
updateMessage("Loading..." + (i + 1) + "%");
}
updateMessage("Finish");
return null;
}
};
StackPane root = new StackPane();
root.getChildren().addAll(veil, mBar, mLabel);
Scene scene = new Scene(root, 300, 250);
veil.visibleProperty().bind(progressTask.runningProperty());
mBar.progressProperty().bind(progressTask.progressProperty());
mLabel.textProperty().bind(progressTask.messageProperty());
primaryStage.setTitle("The lesson of Task");
primaryStage.setScene(scene);
new Thread(progressTask).start();
}
@Override
public void start(Stage primaryStage) {
init(primaryStage);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
上面是Task的使用示例。
Region只是一个灰度蒙版,visible属性与Task的running属性绑定,Task执行结束的时候,蒙版Region也消失。
通过创建一个Task,然后在Task的call方法中进行耗时操作的处理。我们可以通过updateProgress和updateMessage进行更新progress和message属性。
进行UI更新的最简单的方式就是将UI控件的属性与Task的各种属性进行绑定,这样在Task进行任务的时候可以同步更新UI。
当然,我们也可以自行的覆盖updateProgress和updateMessage等方法,进行自定义的操作。这样就和使用android中的AsyncTask是一样的。
另外,JavaFX中提供了一个将JavaFX打包为本地安装文件的工具(支持Windows,Linux和Mac),我自己也使用过,有时间再写写相关的情况。
转载请注明出处:http://blog.csdn.net/ml3947
-------------------------------------------------------------------------------------------------
好久没有写博客了,可能是工作上和感情上的一些问题,从9月份开始后的几个月都没怎么动博客。
最近一切都走上正轨,所以又开始写写博客。
希望大家工作顺利。
分享到:
相关推荐
在JavaFX中,处理耗时任务时,如大量数据计算或网络通信,如果不使用多线程,可能会导致用户界面(UI)冻结,用户体验下降。为了解决这个问题,JavaFX提供了对Java多线程特性的良好支持,使我们能够在后台线程中执行...
在这个特定的场景中,我们讨论的是使用JavaFX实现截图功能,这是一种常见的需求,特别是在开发桌面应用时,比如屏幕录制软件或者任何需要获取用户屏幕图像的应用。 首先,我们要理解JavaFX如何提供屏幕捕获的能力。...
9. **线程处理**:由于I/O操作通常需要较长的时间,为了防止阻塞UI线程,可以使用Task或Service来异步处理文件操作,并通过回调更新UI状态。 10. **模块化和打包**:JavaFX 11及以后版本不再包含在JDK中,需要单独...
JavaFX提供了`Task`和`Service`类来进行异步处理。 3. **事件处理**:用户与界面的交互,如点击按钮发送消息,需要通过事件监听机制来实现。在JavaFX中,可以通过`setOnAction`方法为按钮添加事件处理器。 4. **...
- **并发编程**:探讨了JavaFX中的并发编程模型,包括Task类和Worker对象,以及如何使用它们来执行后台任务。 #### 章节7:在JavaFX中创建图表 本章关注JavaFX中的图表绘制功能。 **关键知识点**: - **图表类型...
这个“javaFX 进度条demo源码”是一个示例程序,可以帮助开发者了解如何在JavaFX应用程序中实现和使用进度条。 在JavaFX中,进度条是`javafx.scene.control.ProgressBar`类的一个实例。这个控件可以设置为两种模式...
由于这涉及到IO操作,应使用JavaFX的Task或者Service组件来执行这些任务,确保它们在后台线程中运行,不会阻塞UI。数据更新后,使用Platform.runLater()方法确保在FX应用线程中更新UI,避免线程安全问题。 6. **...
在JavaFX中,我们通常使用Platform.runLater()方法来在UI线程(也称为JavaFX线程)上执行任务,确保不会阻塞UI更新。 - **Event Dispatch Thread(事件分发线程)**:JavaFX的UI操作必须在EDT上执行,以保证界面的...
在JavaFX中,通常会在后台线程(如Task或Service)中执行数据库操作,以避免阻塞UI线程。数据操作完成后,可以更新UI组件,显示查询结果或处理事务。例如,可以使用TableView组件展示数据库表中的数据,用户可以直接...
例如,使用Java 8的`CompletableFuture`或者`Task`类。 最后,实验中的演示视频可能是对整个过程的详细展示,包括如何配置开发环境,编写数据库脚本,设计JavaFX界面,以及测试选课系统的功能。观看视频可以帮助...
JavaFX 提供了 `Task` 和 `Service` 类来处理这种异步操作。 在 IRC 功能实现方面,项目可能使用了如 `java.net.Socket` 或 `java.nio` API 进行网络通信,以及解析 IRC 协议的消息格式。IRC 协议基于文本,包括...
- **并发编程**:这部分详细讲解了如何在JavaFX中实现并发编程,包括Task类的使用方法。 - **性能优化**:书中还提到了一些关于性能优化的建议,帮助开发者写出更加高效的代码。 #### 八、第七章概览:在JavaFX中...
JavaFX的异步(后台线程)分析基础结构——BackCheckFX,是为了解决JavaFX应用...在学习和使用BackCheckFX时,理解其核心原理,熟练掌握Task的使用,以及熟悉其提供的各种辅助工具,对于提升JavaFX开发能力大有裨益。
7. **多线程**:为了防止用户界面在发送邮件时冻结,可以使用JavaFX的Task或Service类实现后台线程,将邮件发送过程放在非UI线程中执行,同时更新界面显示发送进度或结果。 8. **配置文件管理**:为了保存用户的...
### JavaFX并发包中的Service与Task #### Service类 `javafx.concurrent.Service`是一个抽象类,用于封装异步任务的执行逻辑。它为执行任务提供了许多便利方法,如启动、取消等,并且可以方便地监控任务的状态变化...
9. **线程安全**:由于数据库操作通常涉及I/O,可能需要在后台线程(如JavaFX的Task或Service)中执行,以避免阻塞UI线程。 10. **JDBC最佳实践**:如关闭数据库资源(连接、语句)以释放系统资源,使用try-with-...
本发行说明将详细介绍如何使用Gradle构建和发布JavaFX应用程序。Gradle的JavaFX插件简化了配置过程,使得开发者可以轻松地引入JavaFX库并创建可跨平台运行的独立应用程序。 1. **设置Gradle项目** 首先,你需要...
JavaFX提供Task和Service类,便于在后台线程中执行耗时操作,然后在主线程中更新UI。 10. **数据绑定**: JavaFX支持双向数据绑定,这使得视图组件的状态可以直接反映模型的变化,反之亦然。这对于保持UI和数据模型...
JavaFX提供了一个名为`concurrency`的包,其中包含了`Task`和`Service`类,它们是处理长时间运行任务的理想工具。以下是如何利用这些类来实现目标的一个示例: ```java import javafx.application.Application; ...
使用JavaFX的`Task`或者`Service`类可以实现异步操作,避免阻塞UI线程。一旦用户验证成功,我们可以创建一个新的Stage实例来加载主界面的场景,并使用`Stage.show()`方法显示它。 总的来说,这个企业员工系统将结合...