Окно JavaFX не отвечает во время внутренней разработки - PullRequest
0 голосов
/ 06 октября 2018

Я использую javaFX с файлом FXML.

при нажатии кнопки системный вызов функции в FxmlController.java, для которой требуется некоторая секунда для уточнения результата.

Во время разработки отображается графический интерфейсзамораживается, пока не будет получен результат.Я знаю, что для 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);
    } 

Кроме того, функция printOut вызывается в файле fxml ... см. Ниже:

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

как можно запустить функцию "readAllDoc" в фоновом режиме, не останавливая графический интерфейс?спасибо

1 Ответ

0 голосов
/ 06 октября 2018

Решено!

Я написал новый класс 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)...
}

это было просто !!: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...