如何在javafx中实时显示文件进度?
我正在javafx应用程序上开发一个文件传输模块。所以它工作得很好,但当我想显示进度时,它会冻结,直到下载完成。所以我决定使用线程来加快进度,但控制台一直告诉我,即使我使用了javafx线程,我也不在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
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=“”;
如果(大小)您通读了吗?服务类似乎适合您的问题。有趣的是,服务类似乎正是我所需要的,一旦我完成,我将向您展示