2010-03-25 26 views
0

J'utilise un client JavaFx très simple pour télécharger des fichiers. J'ai lu le fichier en morceaux de 1 Mo (en utilisant Byte Buffer) et je l'ai uploadé en utilisant un POST multi-parties sur un script PHP. Je souhaite mettre à jour la barre de progression de mon client pour afficher la progression après le chargement de chaque segment. Les calculs de progression du téléchargement semblent corrects, mais la barre de progression n'est pas mise à jour. J'utilise le mot-clé bind.La liaison de données Java Fx ne fonctionne pas avec le fichier Read

Je ne suis pas un expert JavaFx et j'espère que quelqu'un peut signaler mon erreur. Je vous écris ce client pour résoudre les problèmes affichés ici (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 
} 

Répondre

0

La vraie raison pour laquelle l'interface graphique n'a pas été mise à jour était parce que tout JavaFX est exécuté dans un thread (EDT). Vous devez utiliser le framework JavaFx Async pour mettre à jour l'interface graphique pendant qu'une tâche en arrière-plan est en cours. S'il vous plaît voir http://blogs.oracle.com/baechul/entry/javafx_1_2_async pour une excellente référence. J'ai résolu ce problème maintenant en créant une JavaTaskBase distincte pour le téléchargement de fichiers.