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