Приложение JavaFX FX Thread Issue - PullRequest
       17

Приложение JavaFX FX Thread Issue

0 голосов
/ 29 ноября 2018

Я делаю настольное приложение и выполняю тяжелую задачу в фоновом режиме.Я хочу, чтобы индикатор выполнения обновлялся.Моя программа работает, и я вижу, что индикатор выполнения здесь не моя проблема.Моя проблема состоит в том, что я использую 2 задачи, которые я запускаю в 2 потока, чтобы сделать и индикатор выполнения, и тяжелую задачу.Мой вопрос: есть ли лучший способ сделать в одере, чтобы избежать ошибки "Исключение в потоке" Thread-5 "java.lang.IllegalStateException: Не в потоке приложения FX; currentThread = Thread-5".

Конечно, я уже проверяю в Интернете, и я всегда нахожу: лучше использовать Platform.runLater.Хорошо, но в обоих новых потоках мне нужен атрибут моего класса, например, я не могу получить доступ, например, "this.myAttribute", когда я использую Platform.runLater ((new Runnable () ...)).Является ли RunLater решением, а я его не вижу?

Вот набор кода, метод setConnection вызывается в потоке JavaFX, а я создаю 2 других.Один для индикатора прогресса, другой для моей задачи:

@FXML
    private void setConnection() {
        try {
            this.onOffButton.setSelected(false);
            if (!this.hubModel.isConnected()) {
                this.progressBar.progressProperty().unbind();
                @SuppressWarnings("unchecked")
                OperationTask progressBarOperationTask = new OperationTask(this) {
                    @Override
                    public Void call() {
                        HubController hubController = (HubController) this.getHubController();
                        hubController.getProgressBar().setVisible(true);
                        for (int i = 0; i < 100; i++) {
                            try {
                                Thread.sleep(25);
                            } catch (InterruptedException e) {
                                Thread.interrupted();
                                break;
                            }
                            updateProgress(i + 1, 100);
                        }
                        hubController.getProgressBar().setVisible(false);
                        return null;
                    }
                };
                this.progressBar.progressProperty().bind(progressBarOperationTask.progressProperty());
                Thread timeThread = new Thread(progressBarOperationTask);
                timeThread.setDaemon(true);
                timeThread.start();
            }

            @SuppressWarnings("unchecked")
            OperationTask connectionOperationTask = new OperationTask(this) {

                @Override
                protected Object call() throws Exception {
                    HubController hubController = (HubController) this.getHubController();
                    if (hubController.getUserID().getText().equals("") || hubController.getUserPW().getText().equals("")) {
                        hubController.getCommentBottom().setText("Please enter a user name and a password.");
                        hubController.getOnOffButton().setSelected(false);
                    } else {
                        hubController.getHubModel().setIdUser(hubController.getUserID().getText());
                        hubController.getHubModel().setPwUser(hubController.getUserPW().getText());
                        String comment = hubController.getHubModel().setConnection();
                        if (!comment.equals("Connection established.")) {
                            hubController.getOnOffButton().setSelected(false);
                        }
                        if (hubController.getHubModel().isConnected()) {
                            hubController.getConnectionStatus().setText("Connected");
                            hubController.getConnectionStatus().setStyle("-fx-font-weight: bold");
                            String commentProject = hubController.getHubModel().getAllProjects();
                            if (commentProject.equals("")) {
                                TextFields.bindAutoCompletion(hubController.getCloneAndMoveController().getNewProjectNameTextField(), hubController.getHubModel().getProjectsList());
                            } else {
                                comment = commentProject;
                            }
                            hubController.getOnOffButton().setSelected(true);
                        } else {
                            hubController.getConnectionStatus().setText("Not connected");
                            hubController.getConnectionStatus().setStyle("-fx-font-weight: regular");
                        }
                        hubController.getCommentBottom().setText(comment);
                    }
                    return null;
                }

            };
            Thread connectionThread = new Thread(connectionOperationTask);
            connectionThread.setDaemon(true);
            connectionThread.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Более того, если вы увидите что-то, что можно улучшить, я был бы признателен (я новичок в Java)

Спасибо.

1 Ответ

0 голосов
/ 29 ноября 2018

Вы можете получить доступ к вашему объекту с Platform.runLater().Новый Runnable, который вы создаете для него, имеет доступ к this экземпляру вашего объекта.Смотрите в примере:

private String myAttribute = "hello";

@Override
public void randomMethod() {
    //...

    Platform.runLater(new Runnable() {
        @Override
        public void run() {
            System.out.println(myAttribute);
        }
    });
}
...