0

我正在我的 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();
        }
    }

这是我调用弹出窗口的代码:

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);
            }
        });
    }
});

我该如何解决?预先感谢。

4

0 回答 0