javaFx Task

本文介绍了如何使用JavaFX创建一个自定义Task类,实现实时与UI交互的线程处理,包括监听任务进度、消息和标题的变化。通过实例展示了如何启动线程、更新UI元素,并演示了如何在call方法中执行文件操作并同步更新进度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);
		}
		
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值