Javafx несколько потоков графического интерфейса - индикатор выполнения

В javafx графические процессы выполняются в отдельном потоке. Помещение индикатора выполнения в фоновый поток с помощью службы и задачи не допускается, поскольку это не поток FX, а индикатор - элемент FX. Можно ли создать несколько потоков графического интерфейса в javafx?

Или есть другой способ заставить индикатор прогресса продолжать вращаться, когда загружаются другие элементы графического интерфейса? В настоящее время он начинает вращаться, затем зависает, пока панель не загрузится.

@FXML
public void budgetShow(ActionEvent event) {
    progressIndicator = new ProgressIndicator(-1.0);
    rootPane.getChildren().add(progressIndicator);
    progressIndicator.setVisible(true);
    progressIndicator.toFront();

    threadBudgetShow().start();
}

public Service<Void> threadBudgetShow() {
Service<Void> service = new Service<Void>() {
    @Override
    protected Task<Void> createTask() {
        return new Task<Void>() {
            @Override
            protected Void call() throws Exception {

                // Background Thread operations.                    
                final CountDownLatch latch = new CountDownLatch(1);

                Platform.runLater(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            // FX Thread opeartions.
                            // budgetAnchorPane - reload.
                            if (budgetAnchorPane == null || !budgetAnchorPane.isVisible()) {
                                budgetAnchorPane = new BudgetAnchorPane();
                                rootPane.getChildren().add(budgetAnchorPane);
                                budgetAnchorPane.setVisible(true);
                                budgetAnchorPane.getChildren().remove(budgetAnchorPane.budgetTypeComboBox);
                                budgetAnchorPane.budgetTypeComboBox = new BudgetTypeCombobox();
                                budgetAnchorPane.getChildren().add(budgetAnchorPane.budgetTypeComboBox);
                            }
                        } finally {
                            rootPane.getChildren().remove(progressIndicator);
                            latch.countDown();
                        }
                    }
                });
                latch.await();
                // Other background Thread operations.
                return null;
            }
        };
    }
};
return service;
}

person Zon    schedule 10.11.2013    source источник
comment
Я также изучил пример индикатора выполнения (docs.oracle.com/javafx/2 /threads/jfxpub-threads.htm), но он пошаговый, я имею в виду бесконечный постоянно скользящий индикатор прогресса.   -  person Zon    schedule 10.11.2013
comment
Что значит катиться? Это анимированные полосы? Чем отличается раздел , отображающий ход выполнения фоновой задачи от чего тебе нужно?   -  person jewelsea    schedule 10.11.2013
comment
В JavaFX невозможно создать несколько потоков графического интерфейса. См. ответ на некоторые общие вопросы параллелизма JavaFX для объяснения .   -  person jewelsea    schedule 10.11.2013
comment
Привет, Джуэлси. Спасибо за вашу поддержку javafx. Прокрутка означает стандартный класс javafx.scene.control ProgressIndicator. Он отличается, потому что он бесконечен, я не считаю шаги, я хочу, чтобы он плавно катился от начала до конца, чтобы показать, что приложение не зависает, а работает. Я прочитал другую ссылку на ответ как хорошее заключение к тому, что привело меня к этому вопросу. Но, думаю, задача обычная. Может быть, есть какой-то другой подход, который мне не хватает, чтобы показать, что графический интерфейс не зависает и загружает панель?   -  person Zon    schedule 11.11.2013


Ответы (1)


Неопределенные индикаторы выполнения

индикатор прогресса продолжает катиться

Я думаю, что вы имеете в виду неопределенный индикатор прогресса.

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

progressIndicator.setProgress(ProgressIndicator.INDETERMINATE);

Неопределенные индикаторы выполнения и задачи

Поскольку прогресс по умолчанию является неопределенным, если вы не обновляете ход выполнения задачи до тех пор, пока задача не будет выполнена, индикатор выполнения, привязанный к прогрессу задачи, останется неопределенным, пока задача выполняется.

Образец

Индикатор выполнения в этом примере будет просто набором вращающихся точек, указывающих на неопределенный прогресс до завершения задачи.

прогресс

import javafx.application.Application;
import javafx.concurrent.Task;
import javafx.geometry.*;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

public class ProgressTracker extends Application {

    final int N_SECS = 10;

    @Override
    public void start(Stage stage) throws Exception {
        Task task = createTask();

        stage.setScene(
            new Scene(
                createLayout(
                    task
                )
            )
        );
        stage.show();

        new Thread(task).start();
    }

    private Task<Void> createTask() {
        return new Task<Void>() {
            @Override public Void call() {
                for (int i=0; i < N_SECS; i++) {
                    if (isCancelled()) {
                        break;
                    }
                    // uncomment updateProgress call if you want to show progress
                    // rather than let progress remain indeterminate.
                    // updateProgress(i, N_SECS);
                    updateMessage((N_SECS - i) + "");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        return null;
                    }
                }

                updateMessage(0 + "");
                updateProgress(N_SECS, N_SECS);

                return null;
            }
        };
    }

    private HBox createLayout(Task task) {
        HBox layout = new HBox(10);

        layout.getChildren().setAll(
            createProgressIndicator(task),
            createCounter(task)
        );

        layout.setAlignment(Pos.CENTER_RIGHT);
        layout.setPadding(new Insets(10));

        return layout;
    }

    private ProgressIndicator createProgressIndicator(Task task) {
        ProgressIndicator progress = new ProgressIndicator();

        progress.progressProperty().bind(task.progressProperty());

        return progress;
    }

    private Label createCounter(Task task) {
        Label counter = new Label();

        counter.setMinWidth(20);
        counter.setAlignment(Pos.CENTER_RIGHT);
        counter.textProperty().bind(task.messageProperty());
        counter.setStyle("-fx-border-color: forestgreen;");

        return counter;
    }

    public static void main(String[] args) {
        launch(args);
    }
}
person jewelsea    schedule 12.11.2013