2010-03-25 57 views
0

我正在使用一個非常簡單的JavaFx客戶端來上傳文件。我以1 MB的塊(使用字節緩衝區)讀取文件,並使用多部分POST將其上傳到PHP腳本。我想更新我的客戶端的進度條,以在每個塊上傳後顯示進度。上傳進度的計算看起來正確,但進度條未更新。我正在使用bind關鍵字。Java Fx數據綁定無法使用文件讀取

我不是JavaFx專家,我希望有人能指出我的錯誤。我寫這個客戶解決這裏(Upload 1GB files using chunking in PHP)公佈的問題


/* 
* 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 
} 

回答

0

的真正原因GUI沒有更新,是因爲一切都在JavaFX是在一個線程(EDT)運行。您需要使用JavaFx異步框架現在要完成一些繁重的後臺任務時更新GUI。請參閱http://blogs.oracle.com/baechul/entry/javafx_1_2_async以獲取最佳參考。現在我通過創建一個單獨的JavaTaskBase文件上傳來解決了這個問題。