Strukturierung mit MVC Muster

Jak111

Mitglied
Im Internet wird immer wieder das MVC Muster bei der Programmierung von Programmen empfohlen. Welches Muster ist eurer Meinung nach das beste ? Oder ist das von Programm zu Programm unterschiedlich?

Ich will ein kleines Programm erstellen um das MVC Muster zu erlernen. Das Programm soll aus 2 Fenstern bestehen. Im 1.Fenster sollen Daten wie Artikel, Kunde, Preis, Menge eingetragen werden können. Das soll das in einer Datenbank abgespeichert werden und in einem 2.Fenster in einer Tabelle aufgelistet werden. Die grafische Oberfläche wollte ich mit JavaFX erstellen. Meine frage ist jetzt wie viele Klassen ich dafür benötige, wenn ich das MVC Muster anwenden will?
Ich habe mir folgendes überlegt:
Model: 1.Klasse (Verbinung zur Datenbank + Befehle zum Speichern und Abfragen von Daten)
View: 2 FXML Dateien (1 Eingabe Fenster und 1 Ausgabe Fenster)
Controller: 1. Klasse zum verbinden von View und Controller

Passt das so? Oder was muss/sollte ich veränden?
Kommt die Main-Methode in die Model Klasse, oder ist das eine eigene Klasse?

Falls jemand von euch einige gute Tutorials zum Thema Programmiermuster oder MVC kennt wäre ich sehr dankbar wenn ihr mir den Link schicken könntet!

Danke für eure Hilfe ! :)
 

Schmetterhand

Aktives Mitglied
Ich würde die Main-Methode in die Controller-Klasse packen.
Mehrfach konnte ich inzwischen sehen, daß dieses MVC-Muster für Spiele hervorragend geeignet ist (es gibt solche furchtbaren kreuz-und-quer-Programme, die alle drei Elemente vermischen, z.B. das geometrische Objekt Shape für eine Kollisionsprüfung verwenden, also wird Model und View vermischt, was letztendlich zu Chaos führt).
Natürlich geht das ganze auch für eine normale GUI wie in deinem Fall.
Hier noch ein Verweis zu einem interessanten Artikel: http://glossar.hs-augsburg.de/Model-View-Controller-Paradigma
 

Kababär

Top Contributor
Controller besitzt deligierte Geschäftslogik. Am besten packt man die tatsächliche Logik nochmal in andere Klassen, die dann dem Controller zugänglich gemacht werden.
Das Model speichert wie gesagt, alle Daten der Anwendung. In diesem Fall ist das nur die Stage der Anwendung und eine Map mit den Namen.

Meiner Meinung nach keine schlechte Idee, auch GUI Elemente im Model zu speichern, falls diese in anderen Klassen benötigt werden, was aber nicht ganz den Kern trifft, denn solche Ereignisse (GUI update, Layout verändern, etc.) sollten vom Controller erledigt werdne.

Ein eindeutiges MVC gibt es ohnehin nicht. Der eine speichert ein paar Elemente im Controller, auch seine Business-Logik, ein anderer packt kleinere Teile der Business-Logik direkt in das Model, bspw. ein Filter bei einem Getter einer Liste.

Weil eben MVC das Programm so dynamisch macht, gibt es auch mehrere Wege, ein MVC zu implementieren.
 

MrSnake

Mitglied
Ich habe mich seit eurem Hinweis ja auch etwas zum Thema MVC belesen und versuche nun eine simple Tabelle nach dieser Struktur zu erstellen - jedoch werden mir die Items nicht in der Tabelle angezeigt - obwohl laut System.out die 4 Items in der Tabelle sein sollten...

Main
Java:
public class Main extends Application {

    private Controller controller = new Controller();

    @Override
    public void start(Stage primaryStage) throws Exception{
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        primaryStage.setTitle("MVC Tabelle");
        primaryStage.setScene(new Scene(root));
        primaryStage.show();
        controller.fill();
        controller.show();
    }


    public static void main(String[] args) {
        launch(args);
    }
}

Controller
Java:
public class Controller {
    public TableView<Person> table = new TableView<>();
    public TableColumn<Person, String> vorname = new TableColumn<>();
    public TableColumn<Person, String>  nachname = new TableColumn<>();
    public TableColumn<Person, Integer>  alter = new TableColumn<>();
    private ObservableList<Person> liste = FXCollections.observableArrayList();

    void fill() {
        liste.add(new Person("Peter","Lustig",69));
        liste.add(new Person("Karl","Mai",66));
        liste.add(new Person("Axel","Schweiß",39));
        liste.add(new Person("Max","Muskel",19));
    }

    void show() {
        vorname.setCellValueFactory(new PropertyValueFactory<>("vorname"));
        nachname.setCellValueFactory(new PropertyValueFactory<>("nachname"));
        alter.setCellValueFactory(new PropertyValueFactory<>("alter"));
        table.setItems(liste);
        System.out.println("Items: "+table.getItems().size());
    }
}

Person
Java:
public class Person {
    String vorname, nachname;
    int alter;

    public Person(String vorname, String nachname, int alter) {
        this.vorname=vorname;
        this.nachname=nachname;
        this.alter=alter;
    }

    public String getVorname() {
        return vorname;
    }

    public String getNachname() {
        return nachname;
    }

    public int getAlter() {
        return alter;
    }
}

FXML
Java:
<VBox fx:controller="sample.Controller"
      xmlns:fx="http://javafx.com/fxml" alignment="center" >
    <TableView fx:id="table" prefHeight="200.0" prefWidth="300.0">
        <columns>
            <TableColumn fx:id="vorname" text="Vorname" prefWidth="100"/>
            <TableColumn fx:id="nachname" text="Nachname" prefWidth="100"/>
            <TableColumn fx:id="alter" text="Alter" prefWidth="100"/>
        </columns>
    </TableView>
</VBox>

Mir werden ja in der Konsole angezeigt, dass die 4 Personen in der Tabelle enthalten sind - nur angezeigt wird nicht einer... Fehlermeldungen gibt es nicht - daher auch kein Punkt nach dem ich suchen könnte^^

Ich steh da echt auf dem Schlauch!

Wer findet den Fehler?!?
 

thet1983

Top Contributor
Hat es einen Grund warum du die Initialisierungsmethode nicht verwendest (Controller)?

Die wird im Controller sobald die FXML geladen wurde automatisch aufgerufen..

Java:
@FXML
public void initialize(){}
 

MrSnake

Mitglied
Ich habe eigentlich nur die Standard Dateien von IntelliJ genommen und den Inhalt der Tabelle da reingepackt...

Die Verbindung von Main, Controller und FXML ist dort also Standard so eingerichtet.
Wenn ich diese initialize Methode dem COntroller hinzufüge kommt dann ja nur der Hinweis "is never used".

Die Frage weshalb der (enthaltene) Inhalt der Items nicht angezeigt wird bleibt aber weiterhin offen^^
 

JStein52

Top Contributor
Ich hätte aber schon mal eine grundlegende Frage:

was würdest du da oben jetzt als Model, was als Controller und was als View bezeichnen ?
 

MrSnake

Mitglied
View ist FXML, Controller ist selbst benannt - auf ein Model habe ich im Falle von 4 kleinen Einträgen zu Testzwecken für die Liste verzichtet - das befindet sich daher mit im Controller
 

JStein52

Top Contributor
Mhmmm, das Wesen von MVC ist aber die Entkopplung dieser drei Domänen, d.h. du kannst dir mal die Kontrollfrage stellen: wo muss ich überall ändern wenn sich die Darstellung ( = View) meiner Daten ändert, z.B. ich möchte die jetzt als TreeView, als TabbedPane oder schlicht und einfach als Textausgabe darstellen.
 

Kababär

Top Contributor
Aus der Main heraus direkt auf den Controller zuzugreifen, ist zwar möglich, meiner Meinung nach aber irreführend. Stell dir vor, du hast mehrere Views:
Die FXML lädst du alle in deiner Main, heißt du gibst deinem Controller nur das Objekt deiner Stage mit und rufst aus dem Controller direkt die neue FXML auf (und schließt die vorherige). Das ist ebenfalls eine Aufgabe des Controllers.

Person ist imho auch ein Model. Im Wort Model verbirgt sich ja nichts anderes dahinter als: Ein Objekt, das Strukturen (hier: alle mögliche Arten von Instanzen und Zustände) beherbergt.

Zu dem Code:
Ich sehe nicht (vielleicht übersehe ich es auch einfach), wo du deiner Table die TableCellFactories zukommen lässt.
Code:
table.getColumns().addAll(vorname, nachname, alter);

Ohne diese Zuordnung weiß die TableView nämlich nicht wohin mit den Einträgen der Liste.
 

MrSnake

Mitglied
In den letzten Tagen habe ich so einige Beispielseiten besucht, viel herumprobiert und letztendlich auch eine funktionierende Lösung gefunden...

Was mir negativ auffällt ist der Fakt, dass auf 3 verschiedenen Seiten auch 3 verschiedene Varianten vorgestellt werden - bei jeder Variante gibt es dann Kommentare die dagegen sprechen und letztendlich sind doch alle irgendwie gleichzeitig gut und schlecht. Was fehlt ist die Kombination aus weiteren FXML als Content und anderen FXML Dateien als neue Fenster - das habe ich bis heute nicht hinbekommen^^

Ich wünsche mir wirklich einfach mal ein komplettes Grundgerüst wo ich sehe, wie mehrere FXML Dateien und Controller verwendet werden UND wie eine FXML Datei sogar als zweites Fenster geöffnet werden kann.

Quasi eine FXML für ein Hauptfenster mit 2 Buttons.
Ein Button lädt eine zweite FXML als Content in die erste.
Der zweite Button öffnet ein weiteres Fenster und die erste FXML bleibt im Hintergrund.

Würde mir so etwas mal einer als Beispiel zusammenschustern und die ZIP per Mail senden oder hochladen?
 

Jardcore

Top Contributor
Schön wäre wenn man hier zu einer Lösung kommt.
Ich habe das glücklicherweise vor knapp einem Jahr gemacht. Ob ich das jetzt aus meiner Erinnerung und von hier (Arbeit) zusammenschuster kann ist die andere Frage.

Strukturiert hatte ich das Projekt mit Maven und die FXML wurden vom ganzen Rest getrennt.

Jede FXML hatte ihren eigenen Controller. Insgesamt hatte ich 4 FXML Dateien. Dabei gab es ein Hauptfenster (1.FXML) und ein Konfigurationsfenster (2.FXML), das Konfigurationsfenster hatte jedoch zwei unterschiedliche Ansichten (3-4 FXML). Das Konfigfenster war im Prinzip nur ein Container für die 3te und 4te View und hatte 3 Button, Zurück, Weiter und Fertig.

Im Konfig-Controller konnte man auf die beiden Controller der 3ten und 4ten FXML zugreifen. Ich glaube das ging mit includes Stichwort "nested Controller" in der FXML des Konfigurationsfenster.

Das Model war vollkommen vom Rest getrennt, außer das die Controller eine Referenz darauf hatten.
Für den Austausch der Daten hatte das Model aber die JavaFx spezifischen Properties benutzt um mithilfe von Databinding die Daten mit dem Controller zu tauschen.
Also die Properties des Controllers wurden bei der Initialisierung mit den Properties des Models verbunden.

Hoffe das hilft schon Mal weiter.
 

MrSnake

Mitglied
Genau sowas wie Jardcore beschrieben hat suche ich einmal als fertiges Beispiel um genau zu sehen WIE ich WO WAS genau einbinden muss um solche Funktionalität hinzubekommen. Ein Fenster mit Content aus verschiedenen FXML (mit Controller) und die Möglichkeit sekundäre Fenster zu erstellen - ich komme mit den Stages nicht klar.

Im Selbststudium komm ich da nicht mehr wirklich voran... Um ehrlich zu sein bringt es mir nichts jetzt noch 2 Beispielseiten zu bekommen wo wieder ein ganz anderer Ansatz gezeigt wird - und wahrscheinlich doch wieder etwas fehlt! Einfach mal ein in sich geschlossenen Beispiel mit diesen oben beschriebenen Funktionalitäten wäre echt nett...

Muss ja nicht viel zu sehen sein - einfach nur ein Grundgerüst - das BasisKit sozusagen^^
 

Jardcore

Top Contributor
Java:
Stage stage = new Stage();
stage.show();

Und schon hast du ein neues Fenster :)

einfach nur ein Grundgerüst
Die Seite die ich gepostet hat zeigt dir das Grundgerüst für das Einbinden einer FXML in eine andere, so bist du schon mal einen Schritt weiter.

Aus rechtlichen Gründen kann ich dir leider meinen Code nicht schicken, die Rechte liegen nämlich bei meiner alten Uni^^

EDIT: sehe gerade der Link geht nicht, hier nochmal komplett:
http://blog.buildpath.de/fxml-compo...-of-an-included-fxml-view-nested-controllers/
 

MrSnake

Mitglied
und wie bekomme ich in die Stage eine FXML eingebaut?
Java:
@FXML
    private void handleButtonAction(ActionEvent event) throws Exception {
        System.out.println("Button clicked!");
        AnchorPane pane = FXMLLoader.load(getClass().getResource("/gmt/view/NewMember.fxml"));
        Scene scene = new Scene(pane);
        Stage stage = new Stage();
        stage.setScene(scene);
        stage.show();
    }
klappt nicht - da kriege ich java.lang.reflect.InvocationTargetException
 

Jardcore

Top Contributor
Du solltest dich wirklich nochmal genauer mit dem Thema befassen um es zu durchdringen, alles andere ist nur hinschustern und nichts können außer abschreiben.
Java:
public void showConfigState() {
    FXMLLoader loader = new FXMLLoader(Starter.class.getResource("...usw");
    Stage stage = new Stage();
    stage.setScene(new Scene(loader.load());
    stage.show();
}

Ich benutzte für Pfadangaben im gesamten Programm immer den gleichen Einsprungort (Starter.class), das hat immer zu den besten Resultaten geführt, wenn mein Programm auf unterschiedlichen Rechnern lief.

Den Controller bekommst du übrigens, wenn du ihn richtig eingebunden hast, über loader.getController();

P.s.: Der Code ist aus meinem Kopf heraus entstanden, deine IDE wird dich schon auf die restlichen Fehler hinweisen XD
 

MrSnake

Mitglied
Danke!

Dein Aussage mit dem "mehr befassen" kann ich durchaus nachvollziehen, da ich JavaFX in meiner Umschulung nur 6 Wochen auf dem Lehrplan hatte und nebenbei auch noch was von C, C#, HTML, PHP, Java, JavaScript und MySQL hängen bleiben soll - bleibt mir nur der Zeitraum im privaten wo neben Frau und Sport recht wenig Zeit bleibt um sich im Selbststudium damit zu beschäftigen.

Oftmals ist es für mich einfach mal hilfreich zu sehen wie es klappt, um es dann zu adaptieren.
So schlimm (mit Beispielen) wie bei JavaFX fand ich es bisher nirgendwo - es gibt viele Möglichkeiten um an das Ziel zu kommen - jede hat vor und Nachteile - egal welche Variante man findet, es gibt viele Gegenstimmen die auf die Schwachstellen hinweisen.

Ich war ja froh die Befehle soweit zu verstehen dass meine (kleinen) Anwendungen funktionieren - das MVC Pattern anzuwenden ist jetzt aber nochmal ein ganz anderer Brocken weil ich damit auf Probleme stoße, die ich ohne MVC garnicht hätte - aber der Vorteil der Trennung ist mir natürlich bewusst, daher versuch ich es ja zu verstehen und anzuwenden...

Also nochmal danke für die Unterstützung, ich versuche Deinen Tip gleich mal umzusetzen!
 

Jardcore

Top Contributor
Kein Problem ich helfe gerne.
So schlimm (mit Beispielen) wie bei JavaFX fand ich es bisher nirgendwo
Das liegt vor Allem daran, dass sich die Technikwelt noch nicht sicher ist, wie sie JavaFX findet und ob es sich genauso etabliert wie Swing. JavaFX ist zwar der offizielle Nachfolger von Swing, aber dank "neuem" HTML5 hat JavaFX ein wenig an Fahrtwind verloren.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Mein erstes eigenes Projekt - Aufbau und Strukturierung Java Basics - Anfänger-Themen 6
Junger_Basileus Celsius -> Fahrenheit / Strukturierung in statischen Methoden Java Basics - Anfänger-Themen 7
M Hilfe bei Strukturierung eines Buchungssystems Java Basics - Anfänger-Themen 3
A Strukturierung des Programms Java Basics - Anfänger-Themen 7
kaoZ Vererbung Strukturierung Java Basics - Anfänger-Themen 10
M Strukturierung Java Basics - Anfänger-Themen 2
U Vernünftige Strukturierung, Guter Stil,. Java Basics - Anfänger-Themen 12
G Strukturierung von Webanwendung Java Basics - Anfänger-Themen 4
G generelle Frage zu Strukturierung von Java-Programmen Java Basics - Anfänger-Themen 2
G Probleme bei der Strukturierung Java Basics - Anfänger-Themen 2
E Durch Muster in Array iterieren Java Basics - Anfänger-Themen 3
B Dekorator Muster - Irgendwas stimmt hier doch nicht? Java Basics - Anfänger-Themen 4
frager2345 Singleton-Muster Java ->Nur eine Instanz einer Klasse erzeugen können Java Basics - Anfänger-Themen 45
frager2345 Java Singleton Muster -> Methode für Konstruktor mit Parametern Java Basics - Anfänger-Themen 3
1 Wie dieses Muster am einfachsten erkennen? Java Basics - Anfänger-Themen 32
H Muster mit verschachtelten Schleifen kreieren. Java Basics - Anfänger-Themen 2
Yasemin bahar Muster erkennen Java Basics - Anfänger-Themen 13
C Erste Schritte Muster ausgeben in der Konsole - großes V Java Basics - Anfänger-Themen 5
U Muster in einem Array erkennen Java Basics - Anfänger-Themen 8
F Quadrat Mit Muster Java Basics - Anfänger-Themen 15
J Muster und Schleifen Java Basics - Anfänger-Themen 33
R 2D Arrays mit vorgegebenem Muster Java Basics - Anfänger-Themen 2
E Arrays nach best Muster füllen Java Basics - Anfänger-Themen 4
K String nach bestimmtem Muster parsen Java Basics - Anfänger-Themen 3
P Sägezahn Muster Programm Java Basics - Anfänger-Themen 2
C Array Muster erzeugen Java Basics - Anfänger-Themen 2
J Erste Schritte zweidimensionales Array Muster befüllen. Java Basics - Anfänger-Themen 4
J Array Muster mit true und false Java Basics - Anfänger-Themen 6
C Muster programmieren Java Basics - Anfänger-Themen 4
C Muster programmieren Java Basics - Anfänger-Themen 4
E Muster auf der Konsole ausgeben lassen (Schleifen) Java Basics - Anfänger-Themen 7
arti28 Erste Schritte For-Schleifen und While-Schleifen, String als Muster ausgeben. Java Basics - Anfänger-Themen 3
L Java Muster Java Basics - Anfänger-Themen 1
Todesbote String auf Muster überprüfen Java Basics - Anfänger-Themen 19
C Array Zickzack Muster Java Basics - Anfänger-Themen 3
P RegEx Muster mehrfach treffen Java Basics - Anfänger-Themen 2
M Muster erkennen. Idee: Fassade. Java Basics - Anfänger-Themen 3
Dit_ Regex | Muster {a}{b}{c} Java Basics - Anfänger-Themen 7
pindakaas Compiler geht nicht (Dekorator Muster) Java Basics - Anfänger-Themen 18
M Datentypen Strings nach Muster auslesen und verarbeiten Java Basics - Anfänger-Themen 5
S X Zeichnen als Muster ausgeben Java Basics - Anfänger-Themen 5
R Muster ausgeben Java Basics - Anfänger-Themen 4
H Muster ausgeben Java Basics - Anfänger-Themen 25
G String auf Muster prüfen Java Basics - Anfänger-Themen 5
O useDelimiter / Muster im Parameter (Pattern) Java Basics - Anfänger-Themen 6
S OOP Warum gleiche Instanz der Klasse? (Factory-Muster) Java Basics - Anfänger-Themen 13
L Sägezahn Muster Java Basics - Anfänger-Themen 4
C Muster mit Zweidimensionalen Arrays Java Basics - Anfänger-Themen 18
0 Applet mit folgendem Muster erstellen Java Basics - Anfänger-Themen 12
P Fragen zum Observer Muster und Datenbanken Java Basics - Anfänger-Themen 2
Z Muster Java Basics - Anfänger-Themen 9
J nach Muster in String suchen Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben