ホームページ >Java >&#&チュートリアル >JavaFX でデータベースリクエストにスレッドを使用するときに「IllegalStateException」を回避する方法は?

JavaFX でデータベースリクエストにスレッドを使用するときに「IllegalStateException」を回避する方法は?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-24 19:34:11864ブラウズ

How to Avoid `IllegalStateException` When Using Threads for Database Requests in JavaFX?

スレッドを使用したデータベースリクエストの実行

JavaFX では、UI の応答性と一貫性を確保するために特定のスレッド ルールに従うことが重要です。これには、バックグラウンド スレッドでのデータベース リクエストなどの長時間実行タスクの実行と、JavaFX アプリケーション スレッドでの UI の更新が含まれます。

スレッド ルール:

  1. ルール 1: シーン グラフの状態と対話するコードはすべて JavaFX アプリケーションで実行する必要がありますthread.
  2. ルール 2: 長時間実行される操作はバックグラウンド スレッドで実行する必要があります。

IllegalStateException 問題:

発生した IllegalStateException は、バックグラウンド スレッドからの courseCodeLbl ラベル。ルール 1 に違反しています。

正しい実装:

スレッドを正しく実装するには、次の手順に従います:

  1. Runnable 実装を作成してデータベースをカプセル化するrequest.
  2. Platform.runLater() メソッドを使用して、JavaFX アプリケーション スレッドの UI 更新をスケジュールします。

javafx.concurrent API の使用:

JavaFX は、同時プログラミングと UI 管理を簡素化する javafx.concurrent API を提供します。 Task クラスは、この API の中心であり、バックグラウンド処理と UI の更新のためのメカニズムを提供します。

サンプル コード:

これは、正しい手順を示すコントローラー クラスの例です。スレッドと Task クラスの使用:

import javafx.concurrent.Task;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;

public class Controller {
    @FXML
    private Button getCourseBtn;
    @FXML
    private TextField courseId;
    @FXML
    private Label courseCodeLbl;
    private ModelController mController;

    public void getCourseNameOnClick() {
        Task<String> courseTask = new Task<>() {
            @Override
            protected String call() {
                String courseName = "";
                Course c = new Course();
                c.setCCode(Integer.valueOf(courseId.getText()));
                mController = new ModelController(c);
                try {
                    ResultSet rs = mController.getResult();
                    if (rs.next()) {
                        courseName = rs.getString(1);
                    }
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
                return courseName;
            }
        };
        courseTask.setOnSucceeded(e -> Platform.runLater(() -> courseCodeLbl.setText(courseTask.getValue())));
        new Thread(courseTask).start();
    }
}

このコードは、データベース リクエストを Task にカプセル化します。 JavaFX アプリケーション スレッドでクエリを実行し、UI を更新します。 JavaFX スレッド ルールを遵守し、API を使用することで、UI の応答性を維持しながらデータベース リクエストを効率的に実行できます。

以上がJavaFX でデータベースリクエストにスレッドを使用するときに「IllegalStateException」を回避する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。