Threading in JavaFX verstehen
JavaFX legt zwei wesentliche Regeln für Threading fest:
Regel 1 (GUI-Threading ):
Jede Interaktion mit einem Knoten in einem JavaFX-Szenendiagramm muss auf der erfolgen JavaFX-Anwendungsthread. Dieser Thread ist sowohl für das Rendern als auch für die Verarbeitung von Benutzerereignissen verantwortlich.
Regel 2 (Hintergrund-Threading):
Vorgänge mit langer Laufzeit sollten in einem Hintergrund-Thread ausgeführt werden, um zu verhindern, dass die Benutzeroberfläche nicht reagiert.
Threading mit javafx.concurrent API
JavaFX bietet eine Task-Klasse zur Verwaltung von Hintergrundvorgängen. Aufgaben verfügen über eine call()-Methode, die in einem separaten Thread ausgeführt wird. Nach Abschluss können Aufgaben UI-Elemente mithilfe ihrer Ereignishandler succeeded() und failed() aktualisieren. Diese Handler werden im FX-Anwendungsthread aufgerufen und stellen die Einhaltung von Regel 1 sicher.
Beispiel: Datenbankzugriff mit Threading
Nehmen wir Ihr Beispiel einer Datenbankabfrage und implementieren es es mittels Threading.
Data Access Object (DAO) Klasse:
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 } } } }
Controller-Klasse:
@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); }
In diesem Beispiel wird die Datenbankabfrage in einem separaten Thread gemäß Regel 2 ausgeführt. Nach Abschluss wird die Benutzeroberfläche im FX-Anwendungsthread gemäß Regel 1 aktualisiert.
Das obige ist der detaillierte Inhalt vonWie gehe ich mit Threading in JavaFX-Anwendungen richtig um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!