首頁 >Java >java教程 >在 JavaFX 中使用執行緒進行資料庫請求時如何避免「IllegalStateException」?

在 JavaFX 中使用執行緒進行資料庫請求時如何避免「IllegalStateException」?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-24 19:34:11866瀏覽

How to Avoid `IllegalStateException` When Using Threads for Database Requests in JavaFX?

使用執行緒執行資料庫請求

在 JavaFX 中,遵循特定的執行緒規則以確保 UI 回應能力和一致性至關重要。這涉及在後台執行緒上執行長時間運行的任務,例如資料庫請求,以及更新 JavaFX 應用程式執行緒上的 UI。

執行緒規則:

  1. 規則1: 任何與場景圖狀態互動的程式碼都必須在JavaFX 應用程式上執行執行緒。
  2. 規則 2: 長時間運行的操作應在後台執行緒上執行。

IllegalStateException 問題:

您遇到的 IllegalStateException 是因為您嘗試從後台更新 courseCodeLbl 標籤執行緒,違反規則 1。

正確實作:

要正確實作線程,請按照下列步驟操作:

  1. 建立 Runnable 實作封裝資料庫要求。
  2. 使用 Platform.runLater() 方法安排 UI 更新JavaFX 應用程式執行緒。

使用 javafx.concurrent API:

JavaFX 提供 javafx.concurrent API 來簡化並發程式設計和 UI 管理。 Task 類別是此 API 的核心,提供後台處理和更新 UI 的機制。

範例程式碼:

這裡是一個範例Controller 類,示​​範了正確的使用執行緒和Task 類別:

import javafx.concurrent.Task;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;

public class Controller {
    @FXML
    private Button getCourseBtn;
    @FXML
    private TextField courseId;
    @FXML
    private Label courseCodeLbl;
    private ModelController mController;

    public void getCourseNameOnClick() {
        Task<String> courseTask = new Task<>() {
            @Override
            protected String call() {
                String courseName = "";
                Course c = new Course();
                c.setCCode(Integer.valueOf(courseId.getText()));
                mController = new ModelController(c);
                try {
                    ResultSet rs = mController.getResult();
                    if (rs.next()) {
                        courseName = rs.getString(1);
                    }
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
                return courseName;
            }
        };
        courseTask.setOnSucceeded(e -> Platform.runLater(() -> courseCodeLbl.setText(courseTask.getValue())));
        new Thread(courseTask).start();
    }
}

此程式碼將資料庫請求封裝在一個Task 中,該任務處理執行查詢和更新JavaFX 應用程式執行緒上的UI。透過遵守 JavaFX 執行緒規則並使用 API,您可以有效率地執行資料庫請求,同時保持 UI 回應能力。

以上是在 JavaFX 中使用執行緒進行資料庫請求時如何避免「IllegalStateException」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn