Поскольку я новичок в JavaFX и ООП, я хотел бы получить отзывы о моей структуре. В частности:
- Наследование: Является ли способ, которым я расширил Fahrzeug (Транспортное средство) до PKW и LKW, правильным для этого варианта использования?
- Логика контроллера: Я помещаю логику проверки и логику прослушивателя (для отключения полей) непосредственно в инициализацию и методы addFahrzeug. Следует ли это разделить?
- Проверка: я использовал регулярное выражение для австрийских номерных знаков. Эффективна ли реализация внутри контроллера?
Вот мой код:
// --- 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();
}
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... ecture-and
Мобильная версия