javaswing和javafxJavaFX之Task的使⽤
任何做过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等操作。
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("0%");
mLabel.setFont(new Font(10));
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("" + (i + 1) + "%");
}
updateMessage("Finish");
return null;
return null;
}
};
StackPane root = new StackPane();
Scene scene = new Scene(root, 300, 250);
veil.visibleProperty().bind(progressTask.runningProperty());
mBar.progressProperty().bind(progressTask.progressProperty());
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),我⾃⼰也使⽤过,有时间再写写相关的情况。
-------------------------------------------------------------------------------------------------
好久没有写博客了,可能是⼯作上和感情上的⼀些问题,从9⽉份开始后的⼏个⽉都没怎么动博客。
最近⼀切都⾛上正轨,所以⼜开始写写博客。
希望⼤家⼯作顺利。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论