我正在将JavaFX与FXML文件一起使用。
单击按钮,系统将调用FxmlController.java中的一个函数,需要花费一些时间来详细说明结果。
在详细说明期间,GUI似乎一直冻结,直到获得结果为止。 我知道,对于GUI我应该使用它,但是我不知道如何。 但这是我的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);
}
此外,在fxml文件中调用了printOut函数...参见下文:
<Button fx:id="read" layoutX="34.0" layoutY="401.0"
mnemonicParsing="false" text="Read All" onAction="#printOut" />
主要是这样:
public void start(Stage stage) throws IOException
{
// Create the FXMLLoader
FXMLLoader loader = new FXMLLoader();
// Path to the FXML File
String fxmlDocPath = getClass().getResource("MyFXML.fxml").getPath();
FileInputStream fxmlStream = new FileInputStream(fxmlDocPath);
// Create the Pane and all Details
AnchorPane root = (AnchorPane) loader.load(fxmlStream);
setPrimaryRoot(root);
ScrollPane sp = (ScrollPane) root.getChildren().get(2);
VBox vb = (VBox) sp.getContent();
setScrollPane(sp);
setVbox(vb);
// Create the Scene
Scene scene = new Scene(root);
// Set the Scene to the Stage
stage.setScene(scene);
// Set the Title to the Stage
stage.setTitle("Project");
setPrimaryStage(stage);
// Display the Stage
stage.show();
}
如何在不冻结GUI的情况下在后台运行“ readAllDoc”功能?谢谢
答案 0 :(得分:0)
解决了!
我写了一个新的类extenderTask:
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)...
}
很简单! :-)