Heim >Java >javaLernprogramm >Wie kann ich Datenbankanfragen in JavaFX sicher ausführen, ohne den UI-Thread zu blockieren?
In JavaFX regeln zwei Schlüsselregeln das Threading:
Ihr Code zeigt eine Ausnahme an, weil Sie versuchen, die zu ändern courseCodeLbl-Label (ein UI-Vorgang) aus einem Hintergrundthread (dem neuen Thread, der mit Runnable erstellt wurde). Dies verstößt gegen Regel 1.
Um dieses Problem zu beheben, sollten Sie die Datenbankanforderung in einem Hintergrundthread ausführen und dann die Benutzeroberfläche im JavaFX-Anwendungsthread aktualisieren. Dies kann mit den folgenden Schritten erreicht werden:
JavaFX stellt die javafx.concurrent API bereit, um die Parallelität zu verwalten und UI-Updates von Hintergrundthreads zu verarbeiten. Task ist die grundlegende Klasse in dieser API und ermöglicht Ihnen Folgendes:
Dem empfohlenen Entwurfsmuster folgend sollte der Datenbankzugriff in einem Data Access Object (DAO) gekapselt werden. -Klasse, die die Benutzeroberfläche nicht kennt. Anschließend kann eine Aufgabe verwendet werden, um die Methoden des DAO in einem Hintergrundthread aufzurufen.
Hier ist ein Beispiel für ein DAO, das Widgets nach Typ abruft:
public class WidgetDAO { public List<Widget> getWidgetsByType(String type) throws SQLException { // Database query to retrieve widgets } }
Und eine Controller-Klasse, die verwendet Aufgabe und javafx.concurrent.Executor zum Ausführen der Datenbankoperation und Aktualisieren Sie die Benutzeroberfläche:
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); } }
Durch die Kapselung des Datenbankzugriffs und die Nutzung der Parallelitäts-API von JavaFX können Sie Datenbankanforderungen in separaten Threads ausführen und gleichzeitig die Reaktionsfähigkeit der Benutzeroberfläche beibehalten.
Das obige ist der detaillierte Inhalt vonWie kann ich Datenbankanfragen in JavaFX sicher ausführen, ohne den UI-Thread zu blockieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!