JavaFX에서는 스레딩을 관리하는 두 가지 핵심 규칙이 있습니다.
귀하의 코드는 시도 중이기 때문에 예외를 드러냅니다. 백그라운드 스레드(Runnable로 생성된 새 Thread)에서 courseCodeLbl 레이블(UI 작업)을 수정합니다. 이는 규칙 1을 위반합니다.
이 문제를 해결하려면 백그라운드 스레드에서 데이터베이스 요청을 실행한 다음 JavaFX 애플리케이션 스레드에서 UI를 업데이트해야 합니다. 이는 다음 단계를 사용하여 달성할 수 있습니다.
JavaFX는 동시성을 관리하고 백그라운드 스레드에서 UI 업데이트를 처리하기 위해 javafx.concurrent API를 제공합니다. Task는 이 API의 기본 클래스이며 이를 통해 다음을 수행할 수 있습니다.
권장 디자인 패턴에 따라 데이터베이스 액세스는 DAO(데이터 액세스 개체)에 캡슐화되어야 합니다. UI를 인식하지 못하는 클래스입니다. 그런 다음 작업을 사용하여 백그라운드 스레드에서 DAO의 메서드를 호출할 수 있습니다.
다음은 유형별로 위젯을 검색하는 DAO의 예입니다.
public class WidgetDAO { public List<Widget> getWidgetsByType(String type) throws SQLException { // Database query to retrieve widgets } }
그리고 다음을 사용하는 컨트롤러 클래스 데이터베이스 작업을 수행하는 Task 및 javafx.concurrent.Executor 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); } }
데이터베이스 액세스를 캡슐화하고 JavaFX의 동시성 API를 활용하면 UI 응답성을 유지하면서 별도의 스레드에서 데이터베이스 요청을 실행할 수 있습니다.
위 내용은 UI 스레드를 차단하지 않고 JavaFX에서 데이터베이스 요청을 안전하게 수행하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!