# Architekturfrage Java Swing (MVC)



## cruppert (17. Jul 2007)

Hallo,
ich habe eine sicher ziemlich simple Frage.

Ich versuche mich zum wiederholten Mal an SWING, hänge aber bei einer grundlegenden Frage was den Programmablauf angeht. Mir fehlen auch irgendwie die Suchwörter bei Google dafür, also dachte ich mir, ich schildere das Problem hier kurz an einem Beispiel, hoffentlich weiß jemand Rat. Ich bin übrigens keinesfalls zu faul zum selber suchen, zum Beweis das angehängte Beispiel. (Wenn ich nicht schon ne Stunde gesucht hätte, würd ich mir die Mühe ja nicht machen..)

Also, nehmen wir an es gibt 4 Klassen in einem Paket:


DataClass
WriterClass
NewJFrame
Main

DataClass enthält einen String als Klassenvariable:


```
public class DataClass {

    public String value = "Haus";
    
    public DataClass() {
        System.out.println("Data class created");
    }  
}
```

WriterClass eine Funktion:


```
public class WriterClass {
    
    public WriterClass() {
    }
    
    public void writeMessage()
    {
        System.out.println("Hello World");
    }
    
}
```

Das Fenster hat zwei Buttons und ein Label...
Das Hauptprogramm sieht so aus:


```
public Main() { }

    public static void main(String[] args) {
              
        DataClass dC = new DataClass();
        WriterClass wC = new WriterClass();

        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            
            public void run() {
                NewJFrame mainWindow = new NewJFrame();
                mainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                mainWindow.pack();
                mainWindow.setVisible(true);
                
            }
        });
}
```

Jetzt die Frage:

Ich möchte das beim Klick auf den Button1 die Funktion der Writerklasse aufgerufen wird.
Beim Klick auf den zweiten Button soll das Label den Text der Variablen der Datenklasse erhalten.

Mehr ist es nicht.
Was ich nicht verstehe, wie "verbinde" ich die Klassen miteinander. Klar könnte ich im ButtonActionListener eine Instanz der Klasse WriterClass erzeugen, und dann einfach direkt die Funktion aufrufen, das erscheint mir aber unsauber. Ich möchte die Variablen möglichst alle in Main initialisieren, und durch das JFrame nur steuern.

Wie gesagt, ich steh bei dem Problem etwas auf der Leitung und wäre für jede Hilfe dankbar..
(Hab immerhin schon viel über die einzelnen Funktionen von Swing gelernt, nur das große ganze Bild fehlt mir noch)

Schöne Grüße,
Christian


----------



## Rydl (17. Jul 2007)

was du da machst, hat nicht viel mit mvc zu tun bis jetzt. 

im FAQ bereich findest du etwas text zu design patterns, zu denen mvc auch gehört: http://www.java-forum.org/de/viewtopic.php?t=6090

nenn am besten mal deine writerclass in writerController um. dann lässt du diesen controller mal actionlistener implementieren. 

als nächstes packst du deine mainfunktion mal einfach in den controller und anstatt als erstes das jframe zu erzeugen, erzeugst du eine instanz deines controllers, etwa so:

```
WriterController wc = new WriterController();
wc.init();
```

die init methode füllst du am besten mit dem code, der dein jframe anzeigt.

nun kommt das zusammenspiel: deine buttons brauchen einen actionlistener, damit die was auf knopfdruck machen. also gibst du den ganzen buttons als actionlistener deine controllerinstanz. 

wie du die referenz da hinbekommst, sei erst mal dir überlassen...
das ding mit mvc ist, dass du deine logik in controller packst, deine view nur vorgekaute daten anzeigt und dein model ggf die view benachrichtigt, wenn der controller da mal was geändert hat und andersrum - also die view benachrichtigt den controller, wenn der user was am model ändern will.


----------



## cruppert (18. Jul 2007)

Vielen Dank...

Design Pattern und dort MVC war das Stichwort. Das Beispiel ist sehr gut, das werde ich mir jetzt erstmal in Netbeans ein wenig anpassen und dann als Ausgangspunkt benutzen.

Und ja, das war kein richtiger MVC Ansatz, aber da will ich hin


----------



## Wildcard (18. Jul 2007)

Im Graphical Editing Framework wird MVC aktiv vorgelebt und dementsprechend gut erklärt:
http://www.ibm.com/developerworks/opensource/library/os-gef/


----------

