Cómo evitar No en el hilo de la aplicación FX; currentThread = Error del hilo de la aplicación JavaFX?

Debajo de los fragmentos de código me está dando el error Not on FX application thread; currentThread Not on FX application thread; currentThread = Application Thread JavaFX . Esta aplicación funcionaba bien en Java 1.7, pero cuando la moví a fx8 ahora está dando un error. cuando inicio la aplicación en mi primer bash, funciona como estaba previsto. Pero después de cerrar el escenario y volver a abrirlo, no funciona.

El error también es ambiguo Not On fx application thread and current thread- javafx application thread Not On fx application thread and current thread- javafx . ¿Qué significaba que no en el subproceso de la aplicación fx si el subproceso actual es un subproceso de la aplicación fx.

  progressDialog = createProgressDialog(service); progressDialog.show(); progressDialog.setOnCloseRequest(new EventHandler() { @Override public void handle(WindowEvent event) { // if (service.isRunning()) { // service.cancel(); progressDialog.close(); // } } }); } @SuppressWarnings("unchecked") private Stage createProgressDialog(final Service 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); } 

Esto sucedió conmigo cuando estaba modificando el elemento UI de la tarea en javafx 2 como elementos de vista de lista. Una tarea que modifica el gráfico de escena me ayudó a resolver el problema, es decir, actualizar los elementos de la interfaz de usuario por

  final ListView group = new ListView (); Task task = new Task() { @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; } }; 

Vocación

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

lo arreglara tambien

Platform.setImplicitExit(false); resolvió mi problema Creo que cambiaron la implementación en JavaFX 8, por lo que el mismo código que funciona sin problemas en JavaFX 2 da un error de thread de la aplicación no fx .

Debería suceder cuando intentas cambiar la UI de algún componente, como un texto de etiqueta. Correr así siempre funciona:

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

Puede cambiar de Forma o ir a otra vista o fxml con esto en cualquier parte de su código:

 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); } }); 

Mi ejemplo en mi controlador:

 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() { @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(); } } } 

No se muestra explícitamente en el código anterior, pero lo que estoy bastante seguro de que está sucediendo es que en algún lugar estás creando un hilo fuera de la aplicación (principal) del hilo javafx, y luego estás tratando de realizar operaciones en objetos javafx (como cerrar , abrir ventanas, etc.) en el SEGUNDO hilo. Esto no está permitido estrictamente, ya que solo el hilo principal puede controlar los objetos javafx directamente. Si esto se convierte en un requisito de su progtwig que necesita usar el segundo hilo para otras cosas como cálculos, etc., etc. Debe usar algún tipo de mensaje para que el otro hilo sepa que desea hacer cualquier acción de javafx.