Подтвердить что ты не робот

Как избежать Не использовать поток приложений FX; currentThread = ошибка приложения JavaFX Application Thread?

Ниже фрагменты кода дают мне ошибку Not on FX application thread; currentThread= JavaFX Application Thread. Это приложение отлично работает в java 1.7, но когда я переместил его в fx8, теперь он дает ошибку. когда я запускаю приложение при первой попытке, он работает по назначению. Но после закрытия сцены и открытия снова он не работает.

Ошибка также неоднозначна Not On fx application thread and current thread- javafx Application Thread. Что это означало не в потоке приложения fx, если текущий поток является потоком приложения fx.

      progressDialog = createProgressDialog(service);
        progressDialog.show();
        progressDialog.setOnCloseRequest(new EventHandler<WindowEvent>() {
          @Override
          public void handle(WindowEvent event) {
            // if (service.isRunning()) {
            // service.cancel();
            progressDialog.close();
            // }
          }
        });

      }

      @SuppressWarnings("unchecked")
      private Stage createProgressDialog(final Service<IStatus> service) {
        stage = new Stage();

        URL url = FileLocator.find(Activator.getDefault().getBundle(),
            new Path("icons/xxx_16x16.png"), null); //$NON-NLS-1$
        stage.getIcons().add(new Image(url.getFile()));
        stage.setTitle("Downloading ..."); //$NON-NLS-1$
        // Creating StackPane
        stage.initModality(Modality.WINDOW_MODAL);
}
4b9b3361

Ответ 1

Platform.setImplicitExit(false); решил мою проблему. Я думаю, что они изменили реализацию в JavaFX 8, поэтому тот же код, который работает без каких-либо проблем в JavaFX 2, дает не ошибку потока приложений fx.

Ответ 2

Вызов

Platform.runLater(new Runnable(){
// ...
});

также исправит это.

Ответ 3

Это произошло со мной, когда я изменял элемент пользовательского интерфейса из задачи в javafx 2, например элементы списка. Задача, которая изменяет график сцены, помогла мне решить проблему, т.е. обновление элементов пользовательского интерфейса с помощью

 final ListView<String> group = new ListView ();

 Task<Void> task = new Task<Void>() {

     @Override protected Void call() throws Exception {

         group.getItems().clear();  

          for (int i=0; i<100; i++) {                
             Platform.runLater(new Runnable() {
                 @Override public void run() {
                     group.getItems.add(i);
                 }
             });
         }
         return null;
     }
 };

Ответ 4

Это должно произойти при попытке изменить некоторый пользовательский интерфейс компонента, как текст ярлыка. Так работает всегда:

@FXML Label myLabel;

Platform.runLater(new Runnable(){
   myLabel.setText("some text");
});

Ответ 5

Вы можете изменить форму или перейти к другому представлению или fxml с этим в любой части вашего кода:

Platform.runLater(() -> {
                            try {
                                Stage st = new Stage();
                                Parent sceneMain = FXMLLoader.load(getClass().getResource("/com/load/free/form/LoadFile.fxml"));
                                Scene scene = new Scene(sceneMain);
                                st.setScene(scene);
                                st.setMaximized(true);
                                st.setTitle("load");
                                st.show();
                            } catch (IOException ex) {
                                Logger.getLogger(LoginController.class.getName()).log(Level.SEVERE, null, ex);
                            }
                        });

Мой пример в моем контроллере:

import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.application.Platform;
import javafx.concurrent.Task;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Hyperlink;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.stage.Stage;


public class LoginController implements Initializable {

    @FXML
    private TextField txtUser;

    @FXML
    private TextField txtPassword;

    @FXML
    private Hyperlink urlForgetPassword;

    @FXML
    private Label lblError;

    @Override
    public void initialize(URL url, ResourceBundle rb) {

    }

    public void isLoginAction(ActionEvent event) {
        String message = "Ingrese ";
        boolean isEmtpy = false;

        if (txtUser.getText().trim().isEmpty()) {
            message += "usuario y ";
            isEmtpy = true;
        }

        if (txtPassword.getText().trim().isEmpty()) {
            message += "contraseña  ";
            isEmtpy = true;
        }
        isEmtpy = false;
        if (isEmtpy) {
            message = message.substring(0, message.length() - 2);
            lblError.getStyleClass().remove("message_process");
            lblError.getStyleClass().add("message_error");
            lblError.setText(message);
        } else {
            lblError.getStyleClass().add("message_process");
            lblError.getStyleClass().remove("message_error");
            Task task = new Task<Void>() {
                @Override
                protected Void call() throws Exception {
                    updateMessage("Procesando...");
                    System.out.println("Asignando DATOS DE PRUEBA ");
                    String passEnc = Encripta.encriptar(txtPassword.getText(), Encripta.HASH_SHA1);
                    int typeRest = new RestConnection().getConnectionUser(txtUser.getText(), passEnc);
                    if (typeRest == 1) {
                        //Load Another form
                        Platform.runLater(() -> {
                            try {
                                Stage st = new Stage();
                                Parent sceneMain = FXMLLoader.load(getClass().getResource("/com/load/free/form/LoadFile.fxml"));
                                Scene scene = new Scene(sceneMain);
                                st.setScene(scene);
                                st.setMaximized(true);
                                st.setTitle("");
                                st.show();
                            } catch (IOException ex) {
                                Logger.getLogger(LoginController.class.getName()).log(Level.SEVERE, null, ex);
                            }
                        });

                    } else {
                        lblError.getStyleClass().remove("message_process");
                        lblError.getStyleClass().add("message_error");
                        updateMessage("Usuario y/o contraseña incorrectos");
                    }
                    return null;
                }
            };

            lblError.textProperty().bind(task.messageProperty());
            new Thread(task).start();

        }

    }

}

Ответ 6

Он явно не показан в приведенном выше коде, но я уверен, что происходит то, что где-то вы создаете поток вне основного потока javafx приложения, а затем пытаетесь выполнить операции над javafx-объектами (например, закрытие, открытие окон и т.д.) в SECOND thread. Это строго запрещено, так как только основной поток может напрямую управлять объектами javafx. Если это становится требованием вашей программы, вам нужно использовать второй поток для других вещей, таких как вычисления, и т.д. И т.д. Вы должны использовать некоторую форму передачи сообщений, чтобы другой поток знал, что вы хотите делать все действия javafx.

Ответ 7

я меняю версию jdk (1.8.0_31 на 1.8.0)

Ответ 8

Я столкнулся с той же проблемой при попытке добавить заставку для моей программы. Вот как мой код был

CircleTest pForm = new CircleTest();

Task<Void> task = new Task<Void>() {
    @Override
    public Void call() {

        try {
            FXMLLoader loader = new FXMLLoader(
                Main.class.getResource("/newRegistration/HomePage.fxml"));
            AnchorPane page = (AnchorPane) loader
                .load();
            dialogStagee.getIcons().add(new Image("/piks/showthumb.png"));
            dialogStagee.setTitle("WALGOTECH SOLUTIONS: 0703445354");
            dialogStagee.initModality(Modality.APPLICATION_MODAL);
            Scene scene = new Scene(page);
            dialogStagee.setScene(scene);
            HomePageController controller = loader.getController();
            controller.setDialogStage(dialogStagee);
            dialogStagee.setMaximized(true);
            dialogStagee.initStyle(StageStyle.UNDECORATED);

            conn.prepareStatement(
                "INSERT INTO 'logs'('date','user','Terminal','Action')"
                    + " VALUES ('"
                    + (java.time.LocalDate.now()
                    + " "
                    + java.time.LocalTime.now().getHour()
                    + ":"
                    + java.time.LocalTime.now().getMinute()
                    + ":" + java.time.LocalTime.now().getSecond())
                    + "',"
                    + "'"
                    + DbConnector.getMyVariablepatientvameloginCategory()
                                                        .split("as")[1]
                    + "',"
                    + "'"
                    + StartPageController.hostname
                    + "',"
                    + " 'Logged in into Registration')")
                                        .execute();
            } catch (Exception e) {
                    e.printStackTrace();
            }   

            return null;
        }
};
pForm.activateProgressBar(task);

task.setOnSucceeded(event -> {

    dialogStagee.show();

    try {

    } catch (Exception e) {

    }
    pForm.getDialogStage().close();
});

pForm.getDialogStage().show();
dialogStage.close();

Thread thread = new Thread(task);
thread.start();

Запуск этого приложения дал "не в приложении fx". Добавив Platform.runLater() внутри моей задачи, это решило проблему. Вот как у меня сейчас есть код:

CircleTest pForm = new CircleTest();

Task<Void> task = new Task<Void>() {
    @Override
    public Void call() {
        Platform.runLater(new Runnable() {

            @Override
            public void run() {

                try {
                    FXMLLoader loader = new FXMLLoader(
                                        Main.class
                                                .getResource("/newRegistration/HomePage.fxml"));
                    AnchorPane page = (AnchorPane) loader
                                        .load();
                    dialogStagee.getIcons().add(
                                        new Image("/piks/showthumb.png"));
                    dialogStagee
                                        .setTitle("WALGOTECH SOLUTIONS: 0703445354");
                    dialogStagee
                                        .initModality(Modality.APPLICATION_MODAL);
                    Scene scene = new Scene(page);
                    dialogStagee.setScene(scene);
                    HomePageController controller = loader
                                        .getController();
                    controller.setDialogStage(dialogStagee);
                    dialogStagee.setMaximized(true);
                    dialogStagee.initStyle(StageStyle.UNDECORATED);

                    conn.prepareStatement(
                        "INSERT INTO 'logs'('date','user','Terminal','Action')"
                        + " VALUES ('"
                        + (java.time.LocalDate.now()
                        + " "
                        + java.time.LocalTime.now().getHour()
                        + ":"
                        + java.time.LocalTime.now().getMinute()
                        + ":" + java.time.LocalTime.now().getSecond())
                        + "',"
                        + "'"
                        + DbConnector.getMyVariablepatientvameloginCategory()
                                                        .split("as")[1]
                        + "',"
                        + "'"
                        + StartPageController.hostname
                        + "',"
                        + " 'Logged in into Registration')")
                                        .execute();
                } catch (Exception e) {
                    e.printStackTrace();
                }   
            }
        });

        return null;
    }
};
pForm.activateProgressBar(task);

task.setOnSucceeded(event -> {

    dialogStagee.show();

    try {

    } catch (Exception e) {

    }
    pForm.getDialogStage().close();
});

pForm.getDialogStage().show();
dialogStage.close();

// dialogStage.setDisable(true);
Thread thread = new Thread(task);
thread.start();

Я надеюсь, что это поможет вам решить проблему. Приветствия.