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