Вы можете использовать эту пользовательскую библиотеку (написанную с помощью Promise) для выполнения удаленного вызова.
function $http(apiConfig) {
return new Promise(function (resolve, reject) {
var client = new XMLHttpRequest();
client.open(apiConfig.method, apiConfig.url);
client.send();
client.onload = function () {
if (this.status >= 200 && this.status < 300) {
// Performs the function "resolve" when this.status is equal to 2xx.
// Your logic here.
resolve(this.response);
}
else {
// Performs the function "reject" when this.status is different than 2xx.
reject(this.statusText);
}
};
client.onerror = function () {
reject(this.statusText);
};
});
}
Пример простого использования:
$http({
method: 'get',
url: 'google.com'
}).then(function(response) {
console.log(response);
}, function(error) {
console.log(error)
});
Это не имеет ничего общего с базой данных. JavaFx, как и почти все библиотеки GUI, требует, чтобы вы использовали только основной поток пользовательского интерфейса для изменения GUI.
Вам необходимо передать данные из базы данных обратно в основной поток пользовательского интерфейса. Используйте Platform.runLater (), чтобы запланировать запуск Runnable в основном потоке пользовательского интерфейса.
public void getCourseNameOnClick(){
new Thread(new Runnable(){
public void run(){
String courseName = requestCourseName();
Platform.runLater(new Runnable(){
courseCodeLbl.setText(courseName)
});
}
}, "Thread A").start();
}
Кроме того, вы можете использовать Task .
Исключение в потоке «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<Void> task = new Task<Void>() { @Override public Void call() { String courseName = ""; Course c = new Course(); c.setCCode(Integer.valueOf(courseId.getText())); mController = new ModelController(c); try { ResultSet rs = mController.<Course>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(); } }