JavaFX - Как обрабатывать изменение TableView перед продолжением кода? [Дубликат]

Вы можете использовать эту пользовательскую библиотеку (написанную с помощью 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)
});
16
задан Mnemonics 15 May 2015 в 10:23
поделиться

3 ответа

38
ответ дан James_D 28 August 2018 в 05:53
поделиться

Это не имеет ничего общего с базой данных. 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 .

1
ответ дан Community 28 August 2018 в 05:53
поделиться

Исключение в потоке «Thread A» java.lang.IllegalStateException: не в потоке приложения FX; currentThread = Thread A

Исключение пытается сказать вам, что вы пытаетесь получить доступ к графику сцены JavaFX вне потока приложений JavaFX. Но где?

courseCodeLbl.setText(rs.getString(1)); // <--- The culprit

Если я не могу этого сделать, как использовать фоновый поток?

Существуют разные подходы, которые приводят к аналогичные решения.

Оберните элемент графика сцены с помощью Platform.runLater

Там проще и проще всего обернуть вышеприведенную строку в Plaform.runLater, чтобы она выполнялась на JavaFX

Platform.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();
    }
}
8
ответ дан ItachiUchiha 28 August 2018 в 05:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: