1、实现Task接口:call中实现业务逻辑
2、创建Thread
3、启动线程
4、task类属性监听器实现UI数据更新
package application.task.task;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.security.KeyStore.Entry;
import javax.management.AttributeChangeNotificationFilter;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.concurrent.Task;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.chart.BarChart;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ProgressBar;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
public class BasicTask extends Application{
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
// TODO Auto-generated method stub
HBox hBox = new HBox();
hBox.setPrefSize(500, 500);
ProgressBar bar = new ProgressBar();
bar.setPrefWidth(300.0);
bar.setProgress(50.0);
Button button = new Button("START");
//线程任务定义
MyTask task = new MyTask();
Thread thread = new Thread(task);
button.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
// TODO Auto-generated method stub
System.out.println(Entry.Attribute.class.getCanonicalName());
// 任务线程调用
thread.start();
System.out.println("over");
}
});
// UI更新绑定监听,可绑定消息、进度、title、状态等等
task.progressProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
bar.setProgress((double) newValue);
}
});
Button button1 = new Button("CANCLE");
button1.setOnAction((e)->{
System.out.println(Entry.Attribute.class.getCanonicalName());
});
Label label = new Label("0");
hBox.getChildren().addAll(button,button1,bar,label);
Scene scene = new Scene(hBox);
primaryStage.setScene(scene);
primaryStage.show();
}
// 任务处理实现
public class MyTask extends Task<Number> {
// 通知更新进度
@Override
protected void updateProgress(long workDone, long max) {
// TODO Auto-generated method stub
super.updateProgress(workDone, max);
System.out.println("max"+workDone+"=="+max);
}
//通知过更新消息
@Override
protected void updateMessage(String message) {
// TODO Auto-generated method stub
super.updateMessage(message);
System.out.println("message"+message);
}
//通知过呢更新标题
@Override
protected void updateTitle(String title) {
// TODO Auto-generated method stub
super.updateTitle(title);
System.out.println("title"+title);
}
//call完成之后被调用
@Override
protected void updateValue(Number value) {
// TODO Auto-generated method stub
super.updateValue(value);
System.out.println("updataValue:"+Platform.isFxApplicationThread());
System.out.println(value);
}
// 更新值,以上的方法在call中被主动调用,调用之后用户可以监听任务的相关属性监听器,实现数据和UI的同步更新
@Override
protected Number call() throws Exception {
System.out.println("isUITHREAD:"+Platform.isFxApplicationThread());
/*
FileInputStream fileInputStream = new FileInputStream("/source/1.txt"); // 关于文件读取错误异常
FileOutputStream fileOutputStream = new FileOutputStream("/source/2.txt");
double a = fileInputStream.available();
byte[] readbyte = new byte[1024];
int i = 0;
double sum = 0.0;
double progress = 0.0;
while ((i = fileInputStream.read(readbyte, 0, readbyte.length)) != -1) {
fileOutputStream.write(readbyte,0,i);
sum+=i;
progress = sum / a;
System.out.println(progress);
}
fileOutputStream.flush();
fileInputStream.close();
fileOutputStream.close();
*/
int x = 0;
double progress = 0.00;
for (int i = 0; i < 100; i++) {
this.updateProgress(i, 100);
x++;
progress = x / 100.00;
System.out.println(progress);
Thread.sleep(100);
if(progress>0.8) {
this.updateMessage("will be finish 80%");
}
}
System.out.println("over111");
return (Number) new Double(progress);
}
}
}