首页 > Java > java教程 > 在 JavaFX 中使用线程进行数据库请求时如何避免'IllegalStateException”?

在 JavaFX 中使用线程进行数据库请求时如何避免'IllegalStateException”?

Mary-Kate Olsen
发布: 2024-12-24 19:34:11
原创
855 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板