Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX窗口在内部细化期间没有响应_Java_User Interface_Javafx - Fatal编程技术网

JavaFX窗口在内部细化期间没有响应

JavaFX窗口在内部细化期间没有响应,java,user-interface,javafx,Java,User Interface,Javafx,我正在使用javaFX和FXML文件 单击按钮,系统将调用一个函数到FxmlController.java中,这需要一些时间来详细说明结果 在精化过程中,GUI似乎一直冻结,直到获得结果为止。 我知道对于GUI,我应该使用threding,但我不知道如何使用。 但是,这是我的FXMLController.java的一段代码,该代码位于onClick按钮上: private void printOut() { List<String> listString = null;

我正在使用javaFX和FXML文件

单击按钮,系统将调用一个函数到FxmlController.java中,这需要一些时间来详细说明结果

在精化过程中,GUI似乎一直冻结,直到获得结果为止。 我知道对于GUI,我应该使用threding,但我不知道如何使用。 但是,这是我的FXMLController.java的一段代码,该代码位于onClick按钮上:

 private void printOut() {
    List<String> listString = null;
    Hyperlink hyperLink = new Hyperlink("test");
    VBox vBox = Main.getVbox();
    vBox.getChildren().clear();
    listString = readAllDoc();  //this is the function that needs time to run
    vBox.getChildren().add(hyperLink);
    } 
如何在后台运行函数“readAllDoc”而不冻结GUI?谢谢

解决了

我已经编写了一个新的类扩展任务:

public class extenderTask extends Task {

private List<String> listString;

@Override
protected List<String> call() throws Exception {
    this.list = functThatTakeLotOfTime();
    return this.listString;
  }
}
公共类扩展任务扩展任务{
私有列表列表字符串;
@凌驾
受保护的列表调用()引发异常{
this.list=functThatTakeLotOfTime();
返回此.listString;
}
}
在控制器中:

extenderTask task = new extenderTask();         
new Thread(task).start();
task.setOnSucceeded(e -> {
setListYourVariable((List<String>) task.getValue()); ...
...(all other action)...
}
extenderTask task=newextendertask();
新线程(任务).start();
task.setonsucceed(e->{
setListYourVariable((列表)task.getValue())。。。
…(所有其他行动)。。。
}

很简单!!:-)

当然,在javafx标记中搜索多线程;)在fx中,您将启动一个配置了自定义任务的线程,该任务执行其工作,并在准备就绪时向fx应用程序线程报告。
public class extenderTask extends Task {

private List<String> listString;

@Override
protected List<String> call() throws Exception {
    this.list = functThatTakeLotOfTime();
    return this.listString;
  }
}
extenderTask task = new extenderTask();         
new Thread(task).start();
task.setOnSucceeded(e -> {
setListYourVariable((List<String>) task.getValue()); ...
...(all other action)...
}