Javafx Java Fx数据绑定不适用于文件读取

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。请参阅以获

我使用一个非常简单的JavaFx客户端来上传文件。我使用字节缓冲区以1MB的块读取文件,并使用多部分POST上传到PHP脚本。我想更新客户端的进度条,以便在上传每个区块后显示进度。上载进度的计算看起来正确,但进度栏未更新。我正在使用bind关键字

我不是JavaFx专家,我希望有人能指出我的错误。我写这个客户是为了解决这里发布的问题


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
}