ホームページ >データベース >mysql チュートリアル >JavaFX アプリケーションでスレッドを正しく処理するにはどうすればよいですか?

JavaFX アプリケーションでスレッドを正しく処理するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-20 19:19:19204ブラウズ

How to Handle Threading Correctly in JavaFX Applications?

JavaFX のスレッド処理について

JavaFX では、スレッド処理に 2 つの重要なルールが課されます。

ルール 1 (GUI スレッド処理) ):
JavaFX シーン内のノードとの対話グラフは JavaFX アプリケーション スレッドで発生する必要があります。このスレッドは、ユーザー イベントのレンダリングと処理の両方を担当します。

ルール 2 (バックグラウンド スレッド):
UI の応答不能を防ぐために、長時間実行される操作はバックグラウンド スレッドで実行する必要があります。

javafx.concurrent によるスレッド化API

JavaFX は、バックグラウンド操作を管理するための Task クラスを提供します。タスクには、別のスレッドで実行される call() メソッドがあります。完了すると、タスクは succeeded() および failed() イベント ハンドラーを使用して UI 要素を更新できます。これらのハンドラーは FX アプリケーション スレッドで呼び出され、ルール 1 への準拠が保証されます。

例: スレッドによるデータベース アクセス

データベース クエリの例を取り上げて実装してみましょう。スレッドを使用します。

データ アクセス オブジェクト (DAO)クラス:

public class CourseDAO {

    private Connection conn;

    public CourseDAO() throws Exception {
        // Establish database connection
    }

    public Course getCourseByCode(int code) throws SQLException {
        try (PreparedStatement stmt = conn.prepareStatement("SELECT * FROM course WHERE c_code = ?")) {
            stmt.setInt(1, code);
            ResultSet rs = stmt.executeQuery();
            if (rs.next()) {
                // Create and populate a Course object
            } else {
                // Handle case where course doesn't exist
            }
        }
    }
}

コントローラー クラス:

@FXML
private TextField courseId;
@FXML
private Label courseCodeLbl;

private CourseDAO courseDAO;

@FXML
public void getCourseOnClick() {
    final int courseCode = Integer.valueOf(courseId.getText());
    Task<Course> courseTask = new Task<>() {
        @Override
        protected Course call() throws Exception {
            return courseDAO.getCourseByCode(courseCode);
        }
    };

    courseTask.setOnSucceeded(e -> {
        Course course = courseTask.getValue();
        if (course != null) {
            courseCodeLbl.setText(course.getName());
        }
    });

    // Execute the task on a background thread
    exec.execute(courseTask);
}

この例では、データベース クエリはルール 2 に従って別のスレッドで実行されます。完了後、UI はルール 1 に従って FX アプリケーション スレッドで更新されます。

以上がJavaFX アプリケーションでスレッドを正しく処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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