In JavaFX, two key rules govern threading:
Your code reveals an exception because you are attempting to modify the courseCodeLbl label (a UI operation) from a background thread (the new Thread created with Runnable). This violates Rule 1.
To resolve this, you should execute the database request in a background thread and then update the UI on the JavaFX application thread. This can be achieved using the following steps:
JavaFX provides the javafx.concurrent API to manage concurrency and handle UI updates from background threads. Task is the fundamental class in this API, and it allows you to:
Following the recommended design pattern, database access should be encapsulated in a Data Access Object (DAO) class, which is unaware of the UI. Then, a task can be used to invoke the DAO's methods on a background thread.
Here's an example of a DAO that retrieves widgets by type:
public class WidgetDAO { public List<Widget> getWidgetsByType(String type) throws SQLException { // Database query to retrieve widgets } }
And a controller class that uses Task and javafx.concurrent.Executor to perform the database operation and update the 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); } }
By encapsulating database access and leveraging JavaFX's concurrency API, you can execute database requests on separate threads while maintaining UI responsiveness.
The above is the detailed content of How to Safely Perform Database Requests in JavaFX Without Blocking the UI Thread?. For more information, please follow other related articles on the PHP Chinese website!