Beginner JavaFX Fleet Management System (Fuhrparkverwaltung) - Architecture and Validation Review [closed]Java

Java-Forum
Anonymous
 Beginner JavaFX Fleet Management System (Fuhrparkverwaltung) - Architecture and Validation Review [closed]

Post by Anonymous »

Ich lerne gerade JavaFX und habe als Übungsprojekt eine einfache „Fuhrparkverwaltung“ geschrieben. Die Anwendung ermöglicht das Hinzufügen von LKWs (LKW) und PKWs (PKW) zu einer Liste, die Validierung der Eingabe (Kennzeichen) und das Sortieren der Liste.
Da ich neu bei JavaFX und OOP bin, würde ich gerne Feedback zu meiner Struktur erhalten. Konkret:
  • Vererbung: Ist die Art und Weise, wie ich Fahrzeug in PKW und LKW erweitert habe, für diesen Anwendungsfall korrekt?
  • Controller-Logik: Ich habe die Validierungslogik und die Listener-Logik (zum Deaktivieren von Feldern) direkt in die Methoden initialize und addFahrzeug eingefügt. Sollte dies getrennt werden?
  • Validierung: Ich habe einen Regex für österreichische Nummernschilder verwendet. Ist die Implementierung innerhalb des Controllers effizient?
Hinweis: Die Variablennamen und UI-Beschriftungen sind auf Deutsch (z. B. „Kennzeichen“ = License Plate), aber die Codestruktur ist Standard-Java.
Hier ist mein Code:

Code: Select all

// --- Model Classes ---

// Fahrzeug.java (Abstract Base Class)
public abstract class Fahrzeug {
private String _kennzeichen;
private String _marke;
private int _kmStand;

public Fahrzeug(String kennzeichen, String marke, int kmStand) {
_kennzeichen = kennzeichen;
_marke = marke;
_kmStand = kmStand;
}
public String getKennzeichen() { return _kennzeichen; }
public String getMarke() { return _marke; }
public int getKmStand() { return _kmStand; }

public abstract String toString();
}

// PKW.java (Car)
public class PKW extends Fahrzeug {
private boolean _hatAngängerkupplung;

public PKW(String kennzeichen, String marke, int kmStand, boolean hatAngängerkupplung) {
super(kennzeichen, marke, kmStand);
_hatAngängerkupplung = hatAngängerkupplung;
}
@Override
public String toString() {
return "PKW: Kennzeichen: " + getKennzeichen() + ", Marke: " + getMarke() +
", KmStand: " + getKmStand() + ", Anhängerkupplung: " +
(_hatAngängerkupplung ? "Ja" : "Nein");
}
}

// LKW.java (Truck)
public class LKW extends Fahrzeug {
private double _maxZuladung;

public LKW(String kennzeichen, String marke, int kmStand, double _maxZuladung) {
super(kennzeichen, marke, kmStand);
this._maxZuladung = _maxZuladung;
}
@Override
public String toString() {
return "LKW: Kennzeichen: " + getKennzeichen() + ", Marke: " + getMarke() +
", KmStand: " + getKmStand() + ", Maximale Zuladung" + _maxZuladung;
}
}

// --- Controller ---

// FahrzeugController.java
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.*;

public class FahrzeugController {

@FXML public TextField txtkennzeichen;
@FXML public TextField txtmarke;
@FXML public TextField txtkilometer;
@FXML public CheckBox ckdAnhaenger;
@FXML public TextField txtmaxladung;
@FXML public ListView fahrzeugList;

private ObservableList fahrzeuge = FXCollections.observableArrayList();

public void initialize() {
fahrzeugList.setItems(fahrzeuge);

// Dummy Data
fahrzeuge.add(new LKW("JO-911-YI", "Ford", 91111, 92.2));
fahrzeuge.add(new LKW("JO-123-AH", "KIA", 12313, 12.12));
fahrzeuge.add(new PKW("JO-721-VA", "Aston", 15512, true));
fahrzeuge.add(new PKW("ZE-521-GI", "Samia", 102111, false));

// Logic to toggle fields based on input
txtmaxladung.textProperty().addListener((observable, oldValue, newValue) -> {
if (!newValue.isEmpty()) {
ckdAnhaenger.setDisable(true);
ckdAnhaenger.setSelected(false);
} else {
ckdAnhaenger.setDisable(false);
}
});
ckdAnhaenger.selectedProperty().addListener((observable, oldValue, newValue) ->  {
if (newValue) {
txtmaxladung.setDisable(true);
txtmaxladung.clear();
} else {
txtmaxladung.setDisable(false);
}
});
}

public void addFahrzeug(ActionEvent actionEvent) {
String marke = txtmarke.getText().trim();
String kennzeichen = txtkennzeichen.getText().trim();
String kilometers = txtkilometer.getText().trim();
String maxladung = txtmaxladung.getText().trim();
boolean anhaenger = ckdAnhaenger.isSelected();

// Regex for Austrian License Plates
String match = "^([A-Z]{1,2}\\-)((\\d){3}\\-([A-Z]{2})|((\\d){5}))$";

if (!kennzeichen.matches(match)) {
showError("Ungültiges Kennzeichen", "Das eingegebene Kennzeichen ist ungültig");
return;
}
for (Fahrzeug fahrzeug : fahrzeuge) {
if (kennzeichen.equals(fahrzeug.getKennzeichen())) {
showError("Doppeltes Kennzeichen", "Das eingegebene Kennzeichen ist bereits vergeben");
return;
}
}
if (marke.isEmpty()) {
showError("Keine Marke gefunden", "Keine Marke gefunden");
return;
}
if (kilometers.isEmpty()) {
showError("Keine Kilometer", "Keine Kilometer gefunden");
return;
}
try {
int kilometer = Integer.parseInt(kilometers);

if (!maxladung.isEmpty()) {
double ladung = Double.parseDouble(maxladung);
fahrzeuge.add(new LKW(kennzeichen, marke, kilometer, ladung));
} else {
fahrzeuge.add(new PKW(kennzeichen, marke, kilometer, anhaenger));
}
} catch (NumberFormatException e) {
showError("Falsches Zahlenformat eingegeben", e.getMessage());
}
}

public void sortFahrzeug(ActionEvent actionEvent) {
fahrzeuge.sort((f1, f2) -> f1.getKennzeichen().compareTo(f2.getKennzeichen()));
}

public void clearFields(ActionEvent actionEvent) {
txtkennzeichen.clear();
txtmarke.clear();
txtkilometer.clear();
ckdAnhaenger.setSelected(false);
txtmaxladung.clear();
}

public void showError(String title, String message) {
Alert alert = new Alert(Alert.AlertType.WARNING);
alert.setTitle(title);
alert.setHeaderText(null);
alert.setContentText(message);
alert.showAndWait();
}
}

// --- Main Application ---
// HelloApplication.java
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.stage.Stage;
import java.io.IOException;

public class HelloApplication extends Application {
@Override
public void start(Stage stage) throws IOException {
FXMLLoader fxmlLoader = new FXMLLoader(HelloApplication.class.getResource("hello-view.fxml"));
Scene scene = new Scene(fxmlLoader.load(), 760, 540);
stage.setTitle("Fuhrparkverwaltung");
// stage.getIcons().add(new Image(HelloApplication.class.getResourceAsStream("icon.png")));
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch();
}
}

Code: Select all





















































Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post