Исключение в потоке «Thread A» java.lang.IllegalStateException: не в потоке приложения FX; currentThread = Thread A
blockquote>Исключение пытается сказать вам, что вы пытаетесь получить доступ к графику сцены JavaFX вне потока приложений JavaFX. Но где?
courseCodeLbl.setText(rs.getString(1)); // <--- The culprit
Если я не могу этого сделать, как использовать фоновый поток?
blockquote>Существуют разные подходы, которые приводят к аналогичные решения.
Оберните элемент графика сцены с помощью Platform.runLater
Там проще и проще всего обернуть вышеприведенную строку в
Plaform.runLater
, чтобы она выполнялась на JavaFXPlatform.runLater(() -> courseCodeLbl.setText(rs.getString(1)));
Использовать задачу
. Более подходящий подход для перехода к этим сценариям - использовать Задача , которая имеет специализированные методы для отправки обновлений. В следующем примере я использую
updateMessage
для обновления сообщения. Это свойство связывается сcourseCodeLbl
textProperty.Task
task = new Task () { @Override public Void call() { String courseName = ""; Course c = new Course(); c.setCCode(Integer.valueOf(courseId.getText())); mController = new ModelController(c); try { ResultSet rs = mController. get(); if(rs.next()) { // update message property updateMessage(rs.getString(1)); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } } public void getCourseNameOnClick(){ try { Thread t = new Thread(task); // To update the label courseCodeLbl.textProperty.bind(task.messageProperty()); t.setDaemon(true); // Imp! missing in your code t.start(); } catch (NumberFormatException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
Вам также необходимо добавить DesktopFormFactor в versionOverrides.