JavaFX之Task的使用
2015-12-14 10:49
351 查看
任何做过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/
[java] view
plaincopy
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),我自己也使用过,有时间再写写相关的情况。
在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/
[java] view
plaincopy
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),我自己也使用过,有时间再写写相关的情况。
相关文章推荐
- 在Swing和Swt中使用JavaFX
- Java Timer的使用(timer.schedule定时执行)
- JavaFX之Drag And Drop拖放操作
- java web.xml文件默认值
- java文件和文件夹复制、删除、移动操作
- 基于JavaFX--WJFXGameEngine游戏引擎介绍与进度
- Java安全(JCA/JSSE):Java加密框架(JCA)简要说明
- JavaFX示例--简易图片处理工具
- java创建文件和目录
- JavaFX的扩展控件库ControlsFX介绍
- JavaFX 3D部分介绍(1) 3D Shape
- Java正则表达式易错知识点汇总
- Eclipse 删除文件恢复
- JavaFX 3D部分介绍(2) Camera
- JavaFX 3D部分介绍(3) Lights
- SpringMVC 项目配置文件加载过程分析(spring4.1.4)
- java语言国际化--ResouceBundle、struts
- JavaFX 3D部分介绍(4) Materials
- 浅谈JavaFX事件机制
- JavaFX之ListView的使用