如何在javafx中实时显示文件进度?

如何在javafx中实时显示文件进度?,java,javafx-2,javafx,Java,Javafx 2,Javafx,我正在javafx应用程序上开发一个文件传输模块。所以它工作得很好,但当我想显示进度时,它会冻结,直到下载完成。所以我决定使用线程来加快进度,但控制台一直告诉我,即使我使用了javafx线程,我也不在javafx线程上 Platform.runLater(new Runnable() { @Override public void run() { 以下是我生成弹出窗口的方法,该弹出窗口应显示进度: public void generateFilePopUpMessage(final Sta

我正在javafx应用程序上开发一个文件传输模块。所以它工作得很好,但当我想显示进度时,它会冻结,直到下载完成。所以我决定使用线程来加快进度,但控制台一直告诉我,即使我使用了javafx线程,我也不在javafx线程上

Platform.runLater(new Runnable() {
  @Override public void run() {
以下是我生成弹出窗口的方法,该弹出窗口应显示进度:

public void generateFilePopUpMessage(final Stage primaryStage,
            final FileTransferRequest request) {
        try {
            popup.show(primaryStage);
            aceptar.setOnAction(new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent event) {
                    class MyRunnable2 implements Runnable {
                        public Label mensaje;

                        /**
                         * @return the mensaje
                         */
                        public Label getMensaje() {
                            return mensaje;
                        }

                        /**
                         * @param mensaje the mensaje to set
                         */
                        public void setMensaje(Label mensaje) {
                            this.mensaje = mensaje;
                        }

                        @Override
                        public void run() {
                            // Accept it
                            IncomingFileTransfer transfer = request.accept();
                            try {
                                transfer.recieveFile(new File(
                                        "C:\\Users\\Raul\\"
                                                + transfer.getFileName()));
                                while (!transfer.isDone()) {
                                    System.out.println("Progress: "
                                            + transfer.getProgress()); 
                                    getMensaje().setText("getProgress: "
                                            + transfer.getProgress());
                                }
                                if (transfer.getStatus().toString()
                                        .contains("Error")) {
                                    getMensaje().setText("Ocurrió un error al recibir el archivo.");
                                } else if (transfer.getStatus().toString()
                                        .contains("Complete")) {
                                    getMensaje().setText("Archivo recibido correctamente.");
                                }
                            } catch (XMPPException ex) {
                                ex.printStackTrace();
                            } finally {
                                popup.hide();
                            }
                        }

                    }
                    MyRunnable2 myRunnable2 = new MyRunnable2();
                    myRunnable2.setMensaje(mensaje); 
                    Thread myThread = new Thread(myRunnable2);
                    myThread.setDaemon(true); // important, otherwise JVM does
                                                // not exit at end of main()
                    myThread.start();
                }
            });
            rechazar.setOnAction(new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent event) {
                    // Reject it
                    try {
                        request.reject();
                    } catch (Exception e) {
                    } finally {
                        popup.hide();
                    }
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
public void generateFilePopUpMessage(最终阶段primaryStage,
最终文件传输请求){
试一试{
弹出显示(初级阶段);
setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent事件){
类MyRunnable2实现Runnable{
公共标签mensaje;
/**
*@returnthemensaje
*/
公共标签getMensaje(){
返回门萨耶;
}
/**
*@param mensaje要设置的mensaje
*/
公共无效setMensaje(标签mensaje){
this.mensaje=mensaje;
}
@凌驾
公开募捐{
//接受它
IncomingFileTransfer=request.accept();
试一试{
transfer.receivefile(新文件(
“C:\\Users\\Raul\\”
+transfer.getFileName());
而(!transfer.isDone()){
System.out.println(“进度:”
+transfer.getProgress());
getMensaje().setText(“getProgress:
+transfer.getProgress());
}
if(transfer.getStatus().toString())
。包含(“错误”)){
getMensaje().setText(“Ocurrióun error al recibir el archivo.”);
}else if(transfer.getStatus().toString())
.包含(“完整”)){
getMensaje();
}
}捕获(XMPPException-ex){
例如printStackTrace();
}最后{
popup.hide();
}
}
}
MyRunnable2 MyRunnable2=新的MyRunnable2();
myRunnable2.setMensaje(mensaje);
线程myThread=新线程(myRunnable2);
myThread.setDaemon(true);//重要,否则JVM会
//未在main()的末尾退出
myThread.start();
}
});
setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent事件){
//拒绝它
试一试{
request.reject();
}捕获(例外e){
}最后{
popup.hide();
}
}
});
}捕获(例外e){
e、 printStackTrace();
}
}
下面是我调用弹出窗口的代码:

manager.addFileTransferListener(new FileTransferListener() {
    public void fileTransferRequest(final FileTransferRequest request) {
        // broadcast something here. Wheather users want to accept file
        // Check to see if the request should be accepted
        boolean accept = false;

        Platform.runLater(new Runnable() {
            @Override
            public void run() {
                popupFile.generateFilePopUpMessage(stage, request); 
                popupFile.getUsuario().setText(request.getRequestor());
                long size = bytesToMeg(request.getFileSize());
                String tam = "";
                if (size <= 0) {
                    size = bytesToK(request.getFileSize());
                    tam = "" + size + "Kb";
                } else {
                    tam = "" + size + "Mb";
                }
                popupFile.getMensaje().setText(
                        "Le envía el siguiente archivo: "
                                + request.getFileName()
                                + ", que pesa: "
                                + tam);
            }
        });
    }
});
manager.addFileTransferListener(新的FileTransferListener(){
公共作废fileTransferRequest(最终fileTransferRequest请求){
//在此处广播内容。其他用户是否要接受文件
//检查请求是否应被接受
布尔接受=假;
Platform.runLater(新的Runnable(){
@凌驾
公开募捐{
generateFilePopUpMessage(阶段,请求);
popupFile.getUsuario().setText(request.getRequestor());
long size=bytesToMeg(request.getFileSize());
字符串tam=“”;

如果(大小)您通读了吗?服务类似乎适合您的问题。有趣的是,服务类似乎正是我所需要的,一旦我完成,我将向您展示