Автоматические события в JavaFX - PullRequest
0 голосов
/ 23 февраля 2019

Можно ли обернуть все приложение JavaFX в цикл while для запуска автоматических событий?Например, в симуляторе аукционного дома:

package main;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {
// Standard JavaFX boilerplate
        primaryStage.show();
       while(true){
          // Get price of this item
          // Update table of listings

        }
}

public static void main(String[] args) {
    launch(args);
}

Я знаю, что цикл заблокирует основной поток для графического интерфейса, поэтому я подумал об использовании системного времени + несколько секунд в цикле while вместо этого:

double systemTime = systemTime;
double executeTime = systemTime + 5;
while(systemTime != executeTime){
//Do things
executeTime = systemTime + 5;
}

Во всяком случае, я знаю, что мне нужно, я просто не знаю, что это называется или реализовано.

1 Ответ

0 голосов
/ 23 февраля 2019

Ну, вы были правы, это скорее всего заблокировало бы поток JavaFX, но также и ваше второе утверждение.Как его все еще зацикливание блокируя поток.Что вы можете сделать, это использовать ScheduledExecutorService , чтобы запустить Runnable или поток, чтобы периодически обновлять графический интерфейс и обновлять его любой информацией.Но вы должны обязательно обернуть части, которые изменяют GUI в потоке JavaFX, что вы можете просто сделать, используя метод Platform.runLater.Или для более тяжелых фоновых задач используйте класс Task для JavaFX.

Для простоты я буду использовать метод runLater.

Пример:

import javafx.application.Application;
import javafx.application.Platform;
import javafx.beans.binding.Bindings;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Priority;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

import java.lang.management.PlatformManagedObject;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;

public class Example extends Application {
private  Scene myscene;
private TextArea exampleText;
public static void main(String[] args) {
    launch(args);
}

@Override
public void start(Stage primaryStage) throws Exception {
    //JavaFX boilerplate
    VBox rootVBox =  new VBox();
    exampleText = new TextArea();
    VBox.setVgrow(exampleText, Priority.ALWAYS);
    myscene = new Scene(rootVBox);
    rootVBox.getChildren().add(exampleText);
    //End of JavaFX boilerplate

    // Scheduler to update gui periodically
    ScheduledExecutorService executor =
            Executors.newSingleThreadScheduledExecutor();

    Random r = new Random();


    Runnable addNewNumber = () -> {
        Platform.runLater(()->{
            System.out.println("I Just updated!!!");
            String newNumber = Integer.toString(r.nextInt(100));
            System.out.println("adding "+ newNumber +"  to textfield ");
        exampleText.appendText(newNumber+"\n");
        });
    };



    executor.scheduleAtFixedRate(addNewNumber, 0, 500, TimeUnit.MILLISECONDS);
    primaryStage.setScene(myscene);
    primaryStage.show();

}

}

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