2010-03-25 6 views
0

매우 간단한 JavaFx 클라이언트를 사용하여 파일을 업로드하고 있습니다. 내가 바이트 덩어리 버퍼를 사용하여 1 MB 청크 파일을 읽고 PHP 스크립트에 여러 부분 POST를 사용하여 업로드하십시오. 각 청크가 업로드 된 후 진행 상황을 보여주기 위해 클라이언트의 진행률 막대를 업데이트하고 싶습니다. 업로드 진행 상태가 올바르게 표시되지만 진행률 막대는 업데이트되지 않습니다. 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

자바 FX의 모든 것이 하나 개의 스레드 (EDT)에서 실행되기 때문에 업데이트되지 않은 GUI이었다 진짜 이유를 해결하기 위해이 클라이언트를 쓰고 있어요. JavaFx Async 프레임 워크를 사용해야합니다. 백그라운드 작업이 진행되는 동안 GUI를 업데이트하십시오. 우수한 참조 자료는 http://blogs.oracle.com/baechul/entry/javafx_1_2_async을 참조하십시오. 파일 업로드를 위해 별도의 JavaTaskBase를 만들어서이 문제를 해결했습니다.