Система управления автопарком JavaFX для начинающих — обзор архитектуры и проверкиJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Система управления автопарком JavaFX для начинающих — обзор архитектуры и проверки

Сообщение Anonymous »

В настоящее время я изучаю JavaFX и в качестве практического проекта написал простую «Fuhrparkverwaltung» (систему управления автопарком). Приложение позволяет добавлять в список грузовики (LKW) и автомобили (PKW), проверять введенные данные (номерные знаки) и сортировать список.
Поскольку я новичок в JavaFX и ООП, я хотел бы получить отзывы о моей структуре. В частности:
  • Наследование: Является ли способ, которым я расширил Fahrzeug (Транспортное средство) до PKW и LKW, правильным для этого варианта использования?
  • Логика контроллера: Я помещаю логику проверки и логику прослушивателя (для отключения полей) непосредственно в инициализацию и методы addFahrzeug. Следует ли это разделить?
  • Проверка: я использовал регулярное выражение для австрийских номерных знаков. Эффективна ли реализация внутри контроллера?
Примечание. Имена переменных и метки пользовательского интерфейса указаны на немецком языке (например, «Kennzeichen» = номерной знак), но структура кода соответствует стандартной Java.
Вот мой код:
// --- 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»