Maison >Java >javaDidacticiel >Comment effectuer en toute sécurité des requêtes de base de données dans JavaFX sans bloquer le thread de l'interface utilisateur ?
Dans JavaFX, deux règles clés régissent le threading :
Votre code révèle une exception car vous tentez de modifier le Étiquette courseCodeLbl (une opération d'interface utilisateur) à partir d'un fil d'arrière-plan (le nouveau Thread créé avec Runnable). Cela viole la règle 1.
Pour résoudre ce problème, vous devez exécuter la requête de base de données dans un thread d'arrière-plan, puis mettre à jour l'interface utilisateur sur le thread d'application JavaFX. Ceci peut être réalisé en suivant les étapes suivantes :
JavaFX fournit l'API javafx.concurrent pour gérer la concurrence et gérer les mises à jour de l'interface utilisateur à partir des threads en arrière-plan. Task est la classe fondamentale de cette API, et elle vous permet de :
En suivant le modèle de conception recommandé, l'accès à la base de données doit être encapsulé dans un Objet d'accès aux données (DAO) classe, qui ne connaît pas l'interface utilisateur. Ensuite, une tâche peut être utilisée pour invoquer les méthodes du DAO sur un thread d'arrière-plan.
Voici un exemple de DAO qui récupère les widgets par type :
public class WidgetDAO { public List<Widget> getWidgetsByType(String type) throws SQLException { // Database query to retrieve widgets } }
Et une classe de contrôleur qui utilise Tâche et javafx.concurrent.Executor pour effectuer l'opération de base de données et mettre à jour le UI :
public class MyController { private WidgetDAO widgetAccessor; private Executor exec; // Executor to execute tasks on a thread pool public void searchWidgets() { final String searchString = widgetTypeSearchField.getText(); Task<List<Widget>> widgetSearchTask = new Task<>() { @Override public List<Widget> call() throws Exception { return widgetAccessor.getWidgetsByType(searchString); } }; widgetSearchTask.setOnSucceeded(e -> { widgetTable.getItems().setAll(widgetSearchTask.getValue()); }); exec.execute(widgetSearchTask); } }
En encapsulant l'accès à la base de données et en tirant parti de l'API de concurrence de JavaFX, vous pouvez exécuter des requêtes de base de données sur des threads distincts tout en conservant la réactivité de l'interface utilisateur.
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!