我正在我的 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);
}
});
}
});
我该如何解决?预先感谢。