首页 >数据库 >mysql教程 >如何在 JavaFX 应用程序中正确处理线程?

如何在 JavaFX 应用程序中正确处理线程?

Linda Hamilton
Linda Hamilton原创
2024-12-20 19:19:19204浏览

How to Handle Threading Correctly in JavaFX Applications?

了解 JavaFX 中的线程

JavaFX 对线程强加了两条基本规则:

规则 1(GUI 线程) ):
与 a 中的节点的任何交互JavaFX 场景图必须出现在 JavaFX 应用程序线程上。该线程负责渲染和处理用户事件。

规则 2(后台线程):
长时间运行的操作应在后台线程上执行,以防止 UI 无响应。

使用 javafx.concurrent 进行线程化API

JavaFX 提供了一个 Task 类来管理后台操作。任务有一个在单独线程上执行的 call() 方法。完成后,任务可以使用其 succeeded()failed() 事件处理程序更新 UI 元素。这些处理程序在 FX 应用程序线程上调用,确保符合规则 1。

示例:使用线程进行数据库访问

让我们以数据库查询为例并实现它使用线程。

数据访问对象(DAO)类:

public class CourseDAO {

    private Connection conn;

    public CourseDAO() throws Exception {
        // Establish database connection
    }

    public Course getCourseByCode(int code) throws SQLException {
        try (PreparedStatement stmt = conn.prepareStatement("SELECT * FROM course WHERE c_code = ?")) {
            stmt.setInt(1, code);
            ResultSet rs = stmt.executeQuery();
            if (rs.next()) {
                // Create and populate a Course object
            } else {
                // Handle case where course doesn't exist
            }
        }
    }
}

控制器类:

@FXML
private TextField courseId;
@FXML
private Label courseCodeLbl;

private CourseDAO courseDAO;

@FXML
public void getCourseOnClick() {
    final int courseCode = Integer.valueOf(courseId.getText());
    Task<Course> courseTask = new Task<>() {
        @Override
        protected Course call() throws Exception {
            return courseDAO.getCourseByCode(courseCode);
        }
    };

    courseTask.setOnSucceeded(e -> {
        Course course = courseTask.getValue();
        if (course != null) {
            courseCodeLbl.setText(course.getName());
        }
    });

    // Execute the task on a background thread
    exec.execute(courseTask);
}

在此示例中,数据库查询在单独的线程上运行,遵循规则 2。完成后,UI 将在 FX 应用程序线程上更新,符合规则 1。

以上是如何在 JavaFX 应用程序中正确处理线程?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn