Как заставить JavaFX ждать, пока узел завершит настройку, прежде чем запускать следующую строку кода - PullRequest
0 голосов
/ 29 января 2019

Я должен выполнить сложный процесс загрузки изображений, который занимает различное количество времени, и пока этот процесс выполняется, я хочу сообщить пользователю, что процесс на самом деле выполняется в фоновом режиме.
Для этого у меня естьуже разочарован в чем-то анимированном, потому что это должно было бы на самом деле находиться в фоновом режиме в другом потоке, поэтому все, что я хочу, это большой красный текст, который говорит что-то вроде "загрузка ... пожалуйста, подождите".
Упрощенный пример:
Main:

public class Controller {
    @FXML
    StackPane mainPane;

    Text text;

    public void initialize(){
        text = new Text();
        text.setText("please wait");
        text.setVisible(false);
        mainPane.getChildren().add(text);

    }

    public void handleMouseClick(){
        text.setVisible(true);
        longProcess();
        text.setVisible(false);
    }

    public void longProcess(){
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

Fxml файл:

<?import javafx.scene.layout.StackPane?>
<StackPane fx:controller="sample.Controller"
           xmlns:fx="http://javafx.com/fxml"
           fx:id="mainPane"
           onMouseClicked="#handleMouseClick">
</StackPane>

Таким образом, этот код создает простую область стека и добавляет к ней невидимый текст, а затем по щелчку мышисначала он должен показать текст, затем перевести поток в спящий режим (напоминающий мой длинный процесс), а затем снова сделать текст невидимым, но он просто переходит в спящий режим и по какой-то причине не отображает текст.

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Измените свой handleMouseClickMethod, чтобы он выглядел следующим образом, и он должен работать

public void handleMouseClick(){
    int delayTime = 10;//Set this to whatever you want your delay in Seconds
    Label text = new Label("please wait");
    mainPane.getChildren().add(text);
    final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
    executorService.scheduleAtFixedRate(()->
            Platform.runLater(()->mainPane.getChildren().remove(text)), delayTime, 1, TimeUnit.SECONDS);
}
0 голосов
/ 29 января 2019

Редактировать:

Поскольку Клеопатра указала, что старый фрагмент не будет работать, я искал, как это сделать, и нашел ответ:

"Следующий код приостановит и изменит значение в метке (полное раскрытие, я повторно использую код, написанный для другого вопроса):"

https://stackoverflow.com/a/26454506/10971694

Старый:

Поможет ли приведенный ниже код?

while(!node.isVisible()){
   System.out.println("waiting...");
   try {
       Thread.sleep(delay);
   } catch (InterruptedException e) {
       e.printStackTrace();
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...