From 489ea74b7a7a3b9f156fd899a1015e63e77b4f2f Mon Sep 17 00:00:00 2001 From: 3010356 <3010356@stud.hs-mannheim.de> Date: Fri, 14 Jun 2024 10:58:38 +0200 Subject: [PATCH] Anpassung nach MVC vorgenommen --- bin/controllers/AddFlightController.class | Bin 0 -> 7170 bytes bin/controllers/LogbookController.class | Bin 0 -> 2505 bytes bin/views/AddFlightScreen.class | Bin 15226 -> 9292 bytes bin/views/ViewLogbookScreen.class | Bin 9947 -> 8826 bytes flights.xml | 162 +++++++++++- pilots.xml | 28 ++- src/controllers/AddFlightController.java | 109 +++++++++ src/controllers/LogbookController.java | 55 +++++ src/views/AddFlightScreen.java | 286 +++++++--------------- src/views/ViewLogbookScreen.java | 30 +-- 10 files changed, 453 insertions(+), 217 deletions(-) create mode 100644 bin/controllers/AddFlightController.class create mode 100644 bin/controllers/LogbookController.class create mode 100644 src/controllers/AddFlightController.java create mode 100644 src/controllers/LogbookController.java diff --git a/bin/controllers/AddFlightController.class b/bin/controllers/AddFlightController.class new file mode 100644 index 0000000000000000000000000000000000000000..d83822d6ee25a72c83729f8b731ba622e839d114 GIT binary patch literal 7170 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 EKhk4b&j0`b literal 0 HcmV?d00001 diff --git a/bin/views/AddFlightScreen.class b/bin/views/AddFlightScreen.class index 5e67197bf143a0061479b1905fae56b5f20506f5..57928dbd1b3df232b33a764cbf881a3e192f5505 100644 GIT binary patch literal 9292 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 A(*OVf diff --git a/flights.xml b/flights.xml index 48806f2..577780f 100644 --- a/flights.xml +++ b/flights.xml @@ -1,5 +1,5 @@ - + @@ -43,6 +43,166 @@ + + + + 1.0 + + + test + + + 11:00 + + + 12:00 + + + 2 + + + 2024-06-11 + + + asd + + + test + + + + + sad + + + ads + + + + äää + + + äää + + + + sad + + + + + + + + + 6.75 + + + max + + + 09:15 + + + 16:00 + + + 2 + + + 2024-06-14 + + + Kommentar + + + Max + + + + + max + + + max + + + + hallo + + + test + + + + max + + + + test + + + + + + + + + + 1.0 + + + mannheim + + + 12:00 + + + 13:00 + + + 1 + + + 2024-06-14 + + + max + + + newTest + + + true + + + + + max + + + max + + + + hallo + + + test + + + + max + + + + test + + + + + + diff --git a/pilots.xml b/pilots.xml index 09938fb..d645733 100644 --- a/pilots.xml +++ b/pilots.xml @@ -1,5 +1,5 @@ - + @@ -49,6 +49,32 @@ + + + + max + + + max + + + + hallo + + + test + + + + max + + + + test + + + + diff --git a/src/controllers/AddFlightController.java b/src/controllers/AddFlightController.java new file mode 100644 index 0000000..682d2df --- /dev/null +++ b/src/controllers/AddFlightController.java @@ -0,0 +1,109 @@ +package controllers; + +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.scene.control.*; +import javafx.stage.Stage; +import models.Flight; +import models.Flights; +import models.Pilot; +import models.Pilots; +import utils.XMLHelper; +import views.HomeScreen; + +import java.time.Duration; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; +import java.util.ArrayList; +import java.util.List; + +public class AddFlightController { + private Stage stage; + private DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm"); + + public AddFlightController(Stage stage) { + this.stage = stage; + } + + public ObservableList loadPilots() { + ObservableList pilotList = FXCollections.observableArrayList(); + Pilots pilots = (Pilots) XMLHelper.loadFromXML("pilots.xml"); + if (pilots != null) { + List pilotEntries = pilots.getPilots(); + pilotList.addAll(pilotEntries); + } + return pilotList; + } + + public void saveFlight(Flight newFlight, DatePicker datumField, TextField musterField, TextField abflugortField, + TextField abflugzeitField, TextField ankunftszeitField, TextField tToFField, TextField anzahlLandungenField, + ComboBox pilotComboBox, CheckBox nachtflugBox, TextField kommentarField) { + try { + double flightDuration = Double.parseDouble(tToFField.getText().replace(',', '.')); + int landings = Integer.parseInt(anzahlLandungenField.getText()); + boolean isNachtflug = nachtflugBox.isSelected(); + + newFlight.setDatum(datumField.getValue()); + newFlight.setMuster(musterField.getText()); + newFlight.setAbflugort(abflugortField.getText()); + newFlight.setAbflugzeit(abflugzeitField.getText()); + newFlight.setAnkunftszeit(ankunftszeitField.getText()); + newFlight.setTToF(flightDuration); + newFlight.setAnzahlLandungen(landings); + newFlight.setPilot(pilotComboBox.getValue()); + newFlight.setNachtflug(isNachtflug); + newFlight.setKommentar(kommentarField.getText()); + newFlight.setDatumStr(datumField.getValue().format(DateTimeFormatter.ISO_LOCAL_DATE)); + + Flights flights = (Flights) XMLHelper.loadFromXML("flights.xml"); + if (flights == null) { + flights = new Flights(new ArrayList<>()); + } + flights.getFlights().add(newFlight); + XMLHelper.saveToXML(flights, "flights.xml"); + + new HomeScreen(stage).display(); + } catch (NumberFormatException e) { + showAlert("Ungültige Eingabe", "Bitte stellen Sie sicher, dass die Flugdauer und die Anzahl der Landungen numerisch sind."); + } catch (IllegalArgumentException e) { + showAlert("Fehlende Eingabe", e.getMessage()); + } catch (Exception e) { + showAlert("Fehler", "Es ist ein Fehler beim Speichern des Flugs aufgetreten."); + e.printStackTrace(); + } + } + + public double calculateFlightDuration(String abflugzeit, String ankunftszeit) throws DateTimeParseException { + LocalTime start = LocalTime.parse(abflugzeit, timeFormatter); + LocalTime end = LocalTime.parse(ankunftszeit, timeFormatter); + return (double) Duration.between(start, end).toMinutes() / 60; + } + + public boolean isValidTime(String time) { + try { + LocalTime.parse(time, timeFormatter); + return true; + } catch (DateTimeParseException e) { + return false; + } + } + + public void setErrorStyle(Control field) { + field.setStyle("-fx-border-color: red;"); + } + + public void clearFieldStyles(Control... fields) { + for (Control field : fields) { + field.setStyle(null); + } + } + + public void showAlert(String title, String message) { + Alert alert = new Alert(Alert.AlertType.ERROR); + alert.setTitle(title); + alert.setHeaderText(null); + alert.setContentText(message); + alert.showAndWait(); + } +} diff --git a/src/controllers/LogbookController.java b/src/controllers/LogbookController.java new file mode 100644 index 0000000..bff54f0 --- /dev/null +++ b/src/controllers/LogbookController.java @@ -0,0 +1,55 @@ +package controllers; + +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.stage.Stage; +import models.Flight; +import models.Flights; +import utils.XMLHelper; +import views.EditFlightScreen; +import views.HomeScreen; + +import java.util.List; + +public class LogbookController { + private Stage stage; + private ObservableList flightList; + + public LogbookController(Stage stage) { + this.stage = stage; + this.flightList = FXCollections.observableArrayList(); + loadFlights(); + } + + public ObservableList getFlightList() { + return flightList; + } + + private void loadFlights() { + Flights flights = (Flights) XMLHelper.loadFromXML("flights.xml"); + if (flights != null) { + List flightEntries = flights.getFlights(); + flightList.addAll(flightEntries); + } + } + + public void editFlight(Flight selectedFlight) { + if (selectedFlight != null) { + new EditFlightScreen(stage, selectedFlight).display(); + } else { + showAlert("Fehler", "Bitte wählen Sie einen Flug aus."); + } + } + + public void goBack() { + new HomeScreen(stage).display(); + } + + private void showAlert(String title, String message) { + javafx.scene.control.Alert alert = new javafx.scene.control.Alert(javafx.scene.control.Alert.AlertType.ERROR); + alert.setTitle(title); + alert.setHeaderText(null); + alert.setContentText(message); + alert.showAndWait(); + } +} diff --git a/src/views/AddFlightScreen.java b/src/views/AddFlightScreen.java index 64b9552..ed790ed 100644 --- a/src/views/AddFlightScreen.java +++ b/src/views/AddFlightScreen.java @@ -1,245 +1,149 @@ package views; -import javafx.collections.FXCollections; +import controllers.AddFlightController; import javafx.collections.ObservableList; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.*; -import javafx.scene.layout.BorderPane; +import javafx.scene.layout.GridPane; +import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.stage.Stage; import models.Flight; -import models.Flights; import models.Pilot; -import models.Pilots; -import utils.XMLHelper; import java.time.LocalDate; -import java.time.LocalTime; -import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeParseException; -import java.util.ArrayList; -import java.util.List; public class AddFlightScreen { private Stage stage; - private DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm"); + private AddFlightController controller; public AddFlightScreen(Stage stage) { this.stage = stage; + this.controller = new AddFlightController(stage); } public void display() { Label label = new Label("Flugdaten eingeben:"); label.setStyle("-fx-font-size: 18px; -fx-font-weight: bold;"); - DatePicker datumField = new DatePicker(); - TextField musterField = new TextField(); - TextField abflugortField = new TextField(); - TextField abflugzeitField = new TextField(); - TextField ankunftszeitField = new TextField(); - TextField tToFField = new TextField(); - TextField anzahlLandungenField = new TextField(); - CheckBox nachtflugBox = new CheckBox("Nachtflug"); - TextField kommentarField = new TextField(); + + Label datumLabel = new Label("Datum:"); + DatePicker datumField = new DatePicker(LocalDate.now()); // Set today's date - datumField.setPromptText("YYYY-MM-DD"); + Label musterLabel = new Label("Muster:"); + TextField musterField = new TextField(); musterField.setPromptText("Muster"); + + Label abflugortLabel = new Label("Abflugort:"); + TextField abflugortField = new TextField(); abflugortField.setPromptText("Abflugort"); + + Label abflugzeitLabel = new Label("Abflugzeit:"); + TextField abflugzeitField = new TextField(); abflugzeitField.setPromptText("HH:mm"); + + Label ankunftszeitLabel = new Label("Ankunftszeit:"); + TextField ankunftszeitField = new TextField(); ankunftszeitField.setPromptText("HH:mm"); + + Label tToFLabel = new Label("Flugdauer (Stunden):"); + TextField tToFField = new TextField(); tToFField.setPromptText("Flugdauer (Stunden)"); + tToFField.setEditable(false); // Make the field read-only + tToFField.setStyle("-fx-control-inner-background: #E0E0E0;"); // Gray out the field + + Label anzahlLandungenLabel = new Label("Anzahl der Landungen:"); + TextField anzahlLandungenField = new TextField(); anzahlLandungenField.setPromptText("Anzahl der Landungen"); + + Label nachtflugLabel = new Label("Nachtflug:"); + CheckBox nachtflugBox = new CheckBox(); + + Label kommentarLabel = new Label("Kommentar:"); + TextField kommentarField = new TextField(); kommentarField.setPromptText("Kommentar"); - // Nur numerische Eingaben für Flugdauer und Anzahl der Landungen zulassen - tToFField.setEditable(false); - anzahlLandungenField.textProperty().addListener((observable, oldValue, newValue) -> { - if (!newValue.matches("\\d*")) { - anzahlLandungenField.setText(oldValue); - } + ObservableList pilotList = controller.loadPilots(); + Label pilotLabel = new Label("Pilot:"); + ComboBox pilotComboBox = new ComboBox<>(pilotList); + + Button saveBtn = new Button("Speichern"); + saveBtn.setStyle("-fx-background-color: #000000; -fx-text-fill: #FFFFFF; -fx-font-weight: bold;"); + saveBtn.setOnAction(e -> { + Flight newFlight = new Flight(); + controller.clearFieldStyles(datumField, musterField, abflugortField, abflugzeitField, ankunftszeitField, tToFField, anzahlLandungenField, kommentarField); + + // Save the flight with the corrected TToF value + controller.saveFlight(newFlight, datumField, musterField, abflugortField, abflugzeitField, ankunftszeitField, tToFField, anzahlLandungenField, pilotComboBox, nachtflugBox, kommentarField); }); - // Validierung und Berechnung der Flugdauer - abflugzeitField.focusedProperty().addListener((observable, oldValue, newValue) -> { - if (!newValue) { - if (!isValidTime(abflugzeitField.getText())) { - abflugzeitField.setStyle("-fx-border-color: red;"); - } else { - abflugzeitField.setStyle(null); - calculateFlightDuration(abflugzeitField, ankunftszeitField, tToFField); - } - } - }); - - ankunftszeitField.focusedProperty().addListener((observable, oldValue, newValue) -> { - if (!newValue) { - if (!isValidTime(ankunftszeitField.getText())) { - ankunftszeitField.setStyle("-fx-border-color: red;"); - } else { - ankunftszeitField.setStyle(null); - calculateFlightDuration(abflugzeitField, ankunftszeitField, tToFField); - } - } - }); - - // Laden der Piloten für die Auswahlbox - Pilots pilotsData = (Pilots) XMLHelper.loadFromXML("pilots.xml"); - List pilotList = pilotsData != null ? pilotsData.getPilots() : new ArrayList<>(); - ObservableList pilots = FXCollections.observableArrayList(pilotList); - - ComboBox pilotComboBox = new ComboBox<>(pilots); - pilotComboBox.setPromptText("Pilot auswählen"); - - Button submitBtn = new Button("Hinzufügen"); - submitBtn.setStyle("-fx-background-color: #000000; -fx-text-fill: #FFFFFF; -fx-font-weight: bold;"); - submitBtn.setOnAction( - e -> handleAddFlight(datumField, musterField, abflugortField, abflugzeitField, ankunftszeitField, - tToFField, anzahlLandungenField, nachtflugBox.isSelected(), kommentarField, pilotComboBox)); - Button backButton = new Button("Zurück"); backButton.setStyle("-fx-background-color: #000000; -fx-text-fill: #FFFFFF; -fx-font-weight: bold;"); backButton.setOnAction(e -> new HomeScreen(stage).display()); - VBox vbox = new VBox(10, label, datumField, musterField, abflugortField, abflugzeitField, ankunftszeitField, - tToFField, anzahlLandungenField, nachtflugBox, kommentarField, pilotComboBox, submitBtn); + // Add listeners to the time fields to update the flight duration automatically + abflugzeitField.textProperty().addListener((observable, oldValue, newValue) -> updateFlightDuration(abflugzeitField, ankunftszeitField, tToFField)); + ankunftszeitField.textProperty().addListener((observable, oldValue, newValue) -> updateFlightDuration(abflugzeitField, ankunftszeitField, tToFField)); + + GridPane grid = new GridPane(); + grid.setAlignment(Pos.CENTER); + grid.setHgap(10); + grid.setVgap(10); + grid.setPadding(new Insets(20)); + + grid.add(label, 0, 0, 2, 1); + + grid.add(datumLabel, 0, 1); + grid.add(datumField, 1, 1); + grid.add(musterLabel, 0, 2); + grid.add(musterField, 1, 2); + grid.add(abflugortLabel, 0, 3); + grid.add(abflugortField, 1, 3); + grid.add(abflugzeitLabel, 0, 4); + grid.add(abflugzeitField, 1, 4); + grid.add(ankunftszeitLabel, 0, 5); + grid.add(ankunftszeitField, 1, 5); + grid.add(tToFLabel, 0, 6); + grid.add(tToFField, 1, 6); + grid.add(anzahlLandungenLabel, 0, 7); + grid.add(anzahlLandungenField, 1, 7); + grid.add(pilotLabel, 0, 8); + grid.add(pilotComboBox, 1, 8); + grid.add(nachtflugLabel, 0, 9); + grid.add(nachtflugBox, 1, 9); + grid.add(kommentarLabel, 0, 10); + grid.add(kommentarField, 1, 10); + + HBox buttonBox = new HBox(10, saveBtn, backButton); + buttonBox.setAlignment(Pos.CENTER); + + VBox vbox = new VBox(20, grid, buttonBox); vbox.setAlignment(Pos.CENTER); vbox.setPadding(new Insets(20)); vbox.setStyle("-fx-background-color: #E6F2FF;"); - BorderPane borderPane = new BorderPane(); - borderPane.setTop(backButton); - borderPane.setCenter(vbox); - BorderPane.setAlignment(backButton, Pos.TOP_LEFT); - BorderPane.setMargin(backButton, new Insets(10)); - - if (pilots.isEmpty()) { - Button addPilotBtn = new Button("Pilot hinzufügen"); - addPilotBtn.setStyle("-fx-background-color: #000000; -fx-text-fill: #FFFFFF; -fx-font-weight: bold;"); - addPilotBtn.setOnAction(e -> new ManagePilotProfileScreen(stage).display()); - vbox.getChildren().add(addPilotBtn); - } - - Scene scene = new Scene(borderPane, 800, 600); + Scene scene = new Scene(vbox, 800, 600); scene.getStylesheets().add(getClass().getResource("/resources/styles.css").toExternalForm()); stage.setScene(scene); stage.show(); } - private void calculateFlightDuration(TextField abflugzeitField, TextField ankunftszeitField, TextField tToFField) { - try { - LocalTime abflugzeit = LocalTime.parse(abflugzeitField.getText(), timeFormatter); - LocalTime ankunftszeit = LocalTime.parse(ankunftszeitField.getText(), timeFormatter); - long durationInMinutes = java.time.Duration.between(abflugzeit, ankunftszeit).toMinutes(); - if (durationInMinutes < 0) { - durationInMinutes += 24 * 60; // Falls über Mitternacht + private void updateFlightDuration(TextField abflugzeitField, TextField ankunftszeitField, TextField tToFField) { + String abflugzeit = abflugzeitField.getText(); + String ankunftszeit = ankunftszeitField.getText(); + + if (controller.isValidTime(abflugzeit) && controller.isValidTime(ankunftszeit)) { + double duration = controller.calculateFlightDuration(abflugzeit, ankunftszeit); + if (duration >= 0) { + tToFField.setText(String.valueOf(duration)); + } else { + controller.showAlert("Ungültige Zeit", "Die Ankunftszeit darf nicht vor der Abflugzeit liegen."); + tToFField.setText(""); } - double durationInHours = durationInMinutes / 60.0; - String formattedDuration = String.format("%.2f", durationInHours); - - tToFField.setText(formattedDuration); - } catch (DateTimeParseException e) { + } else { tToFField.setText(""); } } - - private boolean isValidTime(String time) { - try { - LocalTime.parse(time, timeFormatter); - return true; - } catch (DateTimeParseException e) { - return false; - } - } - - private void handleAddFlight(DatePicker datumField, TextField musterField, TextField abflugortField, - TextField abflugzeitField, TextField ankunftszeitField, TextField tToFField, - TextField anzahlLandungenField, boolean isNachtflug, TextField kommentarField, - ComboBox pilotComboBox) { - try { - clearFieldStyles(datumField, musterField, abflugortField, abflugzeitField, ankunftszeitField, - tToFField, anzahlLandungenField, kommentarField, pilotComboBox); - - if (datumField.getValue() == null || musterField.getText().isEmpty() || abflugortField.getText().isEmpty() - || - abflugzeitField.getText().isEmpty() || ankunftszeitField.getText().isEmpty() - || tToFField.getText().isEmpty() || - anzahlLandungenField.getText().isEmpty() || pilotComboBox.getValue() == null) { - throw new IllegalArgumentException("Bitte füllen Sie alle Felder aus."); - } - - if (!isValidTime(abflugzeitField.getText())) { - setErrorStyle(abflugzeitField); - throw new IllegalArgumentException("Ungültige Abflugzeit."); - } - - if (!isValidTime(ankunftszeitField.getText())) { - setErrorStyle(ankunftszeitField); - throw new IllegalArgumentException("Ungültige Ankunftszeit."); - } - - System.out.println("Flugdauer vor dem Parsen: " + tToFField.getText()); // Debug-Ausgabe - double flightDuration; - try { - // Ersetzen des Kommas durch einen Punkt - String flightDurationText = tToFField.getText().replace(",", "."); - flightDuration = Double.parseDouble(flightDurationText); - } catch (NumberFormatException e) { - setErrorStyle(tToFField); - throw new IllegalArgumentException("Flugdauer muss eine gültige Zahl sein."); - } - - int landings = Integer.parseInt(anzahlLandungenField.getText()); - - Flight newFlight = new Flight(); - newFlight.setDatum(datumField.getValue()); // Setzen des Datums als LocalDate - newFlight.setMuster(musterField.getText()); - newFlight.setAbflugort(abflugortField.getText()); - newFlight.setAbflugzeit(abflugzeitField.getText()); - newFlight.setAnkunftszeit(ankunftszeitField.getText()); - newFlight.setTToF(flightDuration); - newFlight.setAnzahlLandungen(landings); - newFlight.setPilot(pilotComboBox.getValue()); - newFlight.setNachtflug(isNachtflug); - newFlight.setKommentar(kommentarField.getText()); - newFlight.setDatumStr(datumField.getValue().format(DateTimeFormatter.ISO_LOCAL_DATE)); // Setzen des DatumStr - - - Flights flights = (Flights) XMLHelper.loadFromXML("flights.xml"); - if (flights == null) { - flights = new Flights(new ArrayList<>()); - } - flights.getFlights().add(newFlight); - XMLHelper.saveToXML(flights, "flights.xml"); - - new HomeScreen(stage).display(); - } catch (NumberFormatException e) { - showAlert("Ungültige Eingabe", - "Bitte stellen Sie sicher, dass die Flugdauer und die Anzahl der Landungen numerisch sind."); - } catch (IllegalArgumentException e) { - showAlert("Fehlende Eingabe", e.getMessage()); - } catch (Exception e) { - showAlert("Fehler", "Es ist ein Fehler beim Speichern des Flugs aufgetreten."); - e.printStackTrace(); - } - } - - private void setErrorStyle(Control field) { - field.setStyle("-fx-border-color: red;"); - } - - private void clearFieldStyles(Control... fields) { - for (Control field : fields) { - field.setStyle(null); - } - } - - private void showAlert(String title, String message) { - Alert alert = new Alert(Alert.AlertType.ERROR); - alert.setTitle(title); - alert.setHeaderText(null); - alert.setContentText(message); - alert.showAndWait(); - } } diff --git a/src/views/ViewLogbookScreen.java b/src/views/ViewLogbookScreen.java index 2b99472..39eb5cf 100644 --- a/src/views/ViewLogbookScreen.java +++ b/src/views/ViewLogbookScreen.java @@ -1,7 +1,7 @@ package views; +import controllers.LogbookController; import javafx.beans.property.SimpleStringProperty; -import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.geometry.Insets; import javafx.geometry.Pos; @@ -11,18 +11,17 @@ import javafx.scene.layout.BorderPane; import javafx.scene.layout.VBox; import javafx.stage.Stage; import models.Flight; -import models.Flights; -import utils.XMLHelper; import java.time.LocalDate; import java.time.format.DateTimeFormatter; -import java.util.List; public class ViewLogbookScreen { private Stage stage; + private LogbookController controller; public ViewLogbookScreen(Stage stage) { this.stage = stage; + this.controller = new LogbookController(stage); } public void display() { @@ -68,28 +67,19 @@ public class ViewLogbookScreen { table.getColumns().addAll(datumCol, musterCol, abflugortCol, abflugzeitCol, ankunftszeitCol, tToFCol, anzahlLandungenCol, pilotCol, nachtflugCol, kommentarCol); - ObservableList flightList = FXCollections.observableArrayList(); - Flights flights = (Flights) XMLHelper.loadFromXML("flights.xml"); - if (flights != null) { - List flightEntries = flights.getFlights(); - flightList.addAll(flightEntries); - } + ObservableList flightList = controller.getFlightList(); table.setItems(flightList); Button editBtn = new Button("Bearbeiten"); editBtn.setStyle("-fx-background-color: #000000; -fx-text-fill: #FFFFFF; -fx-font-weight: bold;"); editBtn.setOnAction(e -> { Flight selectedFlight = table.getSelectionModel().getSelectedItem(); - if (selectedFlight != null) { - new EditFlightScreen(stage, selectedFlight).display(); - } else { - showAlert("Fehler", "Bitte wählen Sie einen Flug aus."); - } + controller.editFlight(selectedFlight); }); Button backButton = new Button("Zurück"); backButton.setStyle("-fx-background-color: #000000; -fx-text-fill: #FFFFFF; -fx-font-weight: bold;"); - backButton.setOnAction(e -> new HomeScreen(stage).display()); + backButton.setOnAction(e -> controller.goBack()); VBox vbox = new VBox(20, label, table, editBtn, backButton); vbox.setAlignment(Pos.CENTER); @@ -102,12 +92,4 @@ public class ViewLogbookScreen { stage.setScene(scene); stage.show(); } - - private void showAlert(String title, String message) { - Alert alert = new Alert(Alert.AlertType.ERROR); - alert.setTitle(title); - alert.setHeaderText(null); - alert.setContentText(message); - alert.showAndWait(); - } }