Javafx Java Fx数据绑定不适用于文件读取
我使用一个非常简单的JavaFx客户端来上传文件。我使用字节缓冲区以1MB的块读取文件,并使用多部分POST上传到PHP脚本。我想更新客户端的进度条,以便在上传每个区块后显示进度。上载进度的计算看起来正确,但进度栏未更新。我正在使用bind关键字 我不是JavaFx专家,我希望有人能指出我的错误。我写这个客户是为了解决这里发布的问题Javafx Java Fx数据绑定不适用于文件读取,javafx,progress-bar,bind,javafx-1,Javafx,Progress Bar,Bind,Javafx 1,我使用一个非常简单的JavaFx客户端来上传文件。我使用字节缓冲区以1MB的块读取文件,并使用多部分POST上传到PHP脚本。我想更新客户端的进度条,以便在上传每个区块后显示进度。上载进度的计算看起来正确,但进度栏未更新。我正在使用bind关键字 我不是JavaFx专家,我希望有人能指出我的错误。我写这个客户是为了解决这里发布的问题 GUI未更新的真正原因是因为JavaFx中的所有内容都在一个线程EDT中运行。当一些繁重的后台任务正在进行时,您需要使用JavaFx异步框架来更新GUI。请参阅以获
GUI未更新的真正原因是因为JavaFx中的所有内容都在一个线程EDT中运行。当一些繁重的后台任务正在进行时,您需要使用JavaFx异步框架来更新GUI。请参阅以获得优秀的参考资料。我现在已经修复了这个问题,创建了一个单独的JavaTaskBase用于文件上传
/*
* Main.fx
*
* Created on Mar 16, 2010, 1:58:32 PM
*/
package webgloo;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.geometry.VPos;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.HBox;
import javafx.scene.layout.LayoutInfo;
import javafx.scene.text.Font;
import javafx.scene.control.ProgressBar;
import java.io.FileInputStream;
/**
* @author rajeev jha
*/
var totalBytes:Float = 1;
var bytesWritten:Float = 0;
var progressUpload:Float;
var uploadURI = "http://www.test1.com/test/receiver.php";
var postMax = 1024000 ;
function uploadFile(inputFile: java.io.File) {
totalBytes = inputFile.length();
bytesWritten = 1;
println("To-Upload - {totalBytes}");
var is = new FileInputStream(inputFile);
var fc = is.getChannel();
//1 MB byte buffer
var chunkCount = 0;
var bb = java.nio.ByteBuffer.allocate(postMax);
while(fc.read(bb) >= 0){
println("loop:start");
bb.flip();
var limit = bb.limit();
var bytes = GigaFileUploader.getBufferBytes(bb.array(), limit);
var content = GigaFileUploader.createPostContent(inputFile.getName(), bytes);
GigaFileUploader.upload(uploadURI, content);
bytesWritten = bytesWritten + limit ;
progressUpload = 1.0 * bytesWritten / totalBytes ;
println("Progress is - {progressUpload}");
chunkCount++;
bb.clear();
println("loop:end");
}
}
var label = Label {
font: Font { size: 12 }
text: bind "Uploaded - {bytesWritten * 100 / (totalBytes)}%"
layoutInfo: LayoutInfo { vpos: VPos.CENTER maxWidth: 120 minWidth: 120 width: 120 height: 30 }
}
def jFileChooser = new javax.swing.JFileChooser();
jFileChooser.setApproveButtonText("Upload");
var button = Button {
text: "Upload"
layoutInfo: LayoutInfo { width: 100 height: 30 }
action: function () {
var outputFile = jFileChooser.showOpenDialog(null);
if (outputFile == javax.swing.JFileChooser.APPROVE_OPTION) {
uploadFile(jFileChooser.getSelectedFile());
}
}
}
var hBox = HBox {
spacing: 10
content: [label, button]
}
var progressBar = ProgressBar {
progress: bind progressUpload
layoutInfo: LayoutInfo { width: 240 height: 30 }
}
var vBox = VBox {
spacing: 10
content: [hBox, progressBar]
layoutX: 10
layoutY: 10
}
Stage {
title: "Upload File"
width: 270
height: 120
scene: Scene {
content: [vBox]
}
resizable: false
}