Comprendre le threading dans JavaFX
JavaFX impose deux règles essentielles pour le threading :
Règle 1 (GUI Threading ):
Toute interaction avec un nœud dans un graphe de scène JavaFX doit avoir lieu sur JavaFX fil de candidature. Ce fil est responsable à la fois du rendu et de la gestion des événements utilisateur.
Règle 2 (threading en arrière-plan) :
Les opérations de longue durée doivent être exécutées sur un thread en arrière-plan pour éviter que l'interface utilisateur ne réponde.
Threading avec l'API javafx.concurrent
JavaFX fournit une classe Task pour gérer les opérations en arrière-plan. Les tâches ont une méthode call() qui s'exécute sur un thread séparé. Une fois terminées, les tâches peuvent mettre à jour les éléments de l'interface utilisateur à l'aide de leurs gestionnaires d'événements succeeded() et failed(). Ces gestionnaires sont invoqués sur le fil d'application FX, garantissant le respect de la règle 1.
Exemple : accès à la base de données avec thread
Prenons votre exemple de requête de base de données et implémentons en utilisant le threading.
Objet d'accès aux données (DAO) Classe :
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 } } } }
Classe du contrôleur :
@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); }
Dans cet exemple, la requête de base de données s'exécute sur un thread distinct, conformément à la règle 2. Une fois terminé, l'interface utilisateur est mise à jour sur le fil d'application FX, conformément à la règle 1.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!