MVC

Status
Nicht offen für weitere Antworten.

kejo

Mitglied
Hallo!

Ich fange gerade mit Java an und wollte mal versuchen ein Programm nach dem MVC Konzept zu schreiben.
Nun habe ich eine Main-, Control-, Gui- und eine Logik Klasse erstellt.
Das Programm soll einfach nur im textfeld der GUI ausgeben, was in der Logikklasse erzeugt und an die Controlklasse weitergegeben wird.
Aber es klappt noch nicht so wie ich das will.

Bin um jede Hilfestellung bzw. Korrektur, wie man es normal machen würde, dankbar.

Hier mal die Klassen:

Code:
public class MAIN {

	public static void main(String[] args) {

		LOGIK myLOGIK = new LOGIK();
		myLOGIK.generateOutput();
		
	}

}

Code:
public class LOGIK {
	
	public void generateOutput()
	{
			CONTROL myCONTROL = new CONTROL();
			myCONTROL.putOut("test");
	}
}

Code:
public class CONTROL {
	public void putOut(String str)
	{
		GUI myGUI = new GUI();
		myGUI.schreibeText(str);
	}
}

Code:
import org.eclipse.swt.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.layout.*;

public class GUI {
	Text textfeld;
	public GUI() 
	{
	Display display = new Display();
	Shell myShell = new Shell(display);
	
	GridLayout gLayout = new GridLayout();
	myShell.setLayout(gLayout);
	
	textfeld = new Text(myShell,SWT.BORDER | SWT.MULTI);
	GridData gData = new GridData(SWT.FILL,SWT.FILL,true, true);
	textfeld.setLayoutData(gData);
	
	myShell.open();
	while (!myShell.isDisposed()) 
	{
          if (!display.readAndDispatch()) display.sleep();
    }
	}
	
	public void schreibeText(String str)
	{
		textfeld.setText(str);
	}
}
 

hupfdule

Top Contributor
Ohne jetzt das tatsächliche Problem zu erkennen (ja, eine Fehlerbeschreibung wäre tatsächlich hilfreich) 2 Tipps:

1. Laut Konvention werden Klassennamen in Pascal-Case geschrieben, nicht vollständig groß (also Logik, statt LOGIK)

2. Bei dir ist der Aufruf, wie folgt: Main -> Logik -> Controller -> GUI. Die Logik soll den Controller aber nicht steuern, sondern der Controller steuert die Logik und die GUI (darum heißt er ja auch Controller)
 

EOB

Top Contributor
hi, stimmt. mal punkt fuer punkt:

(M)odel

das modell ist deine anwendungslogik, oder auch geschaeftslogik genannt. hier ist alles, was deine anwendung im kern ausmacht. das model sollte von einem controller gerufen werden. schau dir auch mal das seeheim modell an.

(V)iew

das sind deine gui componenten. ich kenn mich mit swt nicht so aus, aber eben alles, was fenster sind, also dialoge, frames etc. von hier wird ein controller aufgerufen. wenn man zb einen button drueckt, wird dessen controller aufgerufen und der ruft dann (am besten ueber ne fassade) das modell auf. du koenntest einen grossen controller machen, oder pro componete einen...ist dir ueberlassen :).

(C)ontroller

na ja und dann eben der controller. in swing gibts dafuer die klasse abtractaction, die man erweitern kann und das ist dann der controller. ist praktisch, muss man aber nicht nehmen. sicher gibts sowas auch in swt, oder? der controller sollte die logik nicht selber implementieren, sondern eben das modell aufrufen und nur prozesse anstossen. in swing ist dahinter das command muster versteckt.

der ablauf ist also so: view-->controller-->modell

viele gruesse
 

kejo

Mitglied
Vielen Dank für die Antworten!
Also, mein Problem ist, dass das Programm einfach nichts ausgibt. Es gibt keine Fehlermeldung, aber auf der Konsole passiert einfach nichts.

Wie muss ich nun vorgehen um es richtig zu machen, brauche ich, oder ist es empfehlenswert außer den MVC Klassen noch eine Main Klasse zu haben?
Soll ich dann in der Mainklasse nur die GUI aufrufen oder den Controller?
 

EOB

Top Contributor
moin, also wenn ueberhaupt, dann rufst du in der Main klasse die gui auf. NICHT den controller, der wird nur von den guicomponenten aufgerufen. also entweder, du startest direkt die gui, oder eben ueber deine main klasse.

gruesse
 

moormaster

Top Contributor
Mørketid hat gesagt.:
moin, also wenn ueberhaupt, dann rufst du in der Main klasse die gui auf. NICHT den controller, der wird nur von den guicomponenten aufgerufen. also entweder, du startest direkt die gui, oder eben ueber deine main klasse.

gruesse

Also das ist ja nun genauso falsch... jetzt gehts ja GUI > Controller > Model... der Controller verwaltet aber quasi GUI und Model. Das heisst, wenn der Controller angelegt wird, dann erstellt er wiederum die GUI und Model Objekte:

http://www.java-forum.org/de/viewtopic.php?t=6090#52829
 

EOB

Top Contributor
ja, aber von der gui wird der controller aufgerufen...sicher verwaltet der controller DANN die gui, indem er neue fenster etc aufmacht.
 

hupfdule

Top Contributor
Nein, aus welchem Grund denn? Das würde doch dem Konzept widersprechen. Und noch dazu den Programmfluss komplizieren.
 

EOB

Top Contributor
ich denke, wir meinen schon das selbe. was passiert denn, wenn man zb. nen button drueckt?
 

hupfdule

Top Contributor
Dann wird natürlich wieder der Controller angesprochen. Es läuft quasi so:

Der Controller erzeugt eine Instanz der GUI und sagt der GUI, dass er für die Abarbeitung von Events zuständig ist. Wenn nun in der GUI ein Button gedrückt wird, sagt die GUI dem Controller "du, da hat jemand nen Button gedrückt". Der Controller tut dann irgendwas und vlt. ändert er noch was an der GUI.

Dafür ist es aber nicht nötig, dass die GUI den Controller erzeugt. Sie hat nur eine Referenz auf den Controller, der sie erzeugt hat.

Siehe auch http://www.java-forum.org/de/viewtopic.php?p=223538
 

EOB

Top Contributor
ja, so mein ich das doch auch. kommt halt auch drauf an, ob man einen controller hat, oder eben mehrere. ich nehm dazu zum beispiel immer AbstractActions. allerdings bin ich mir jetzt nicht sicher, wie denn nun die gui wirklich aufgerufen werden soll? also zb wenn man eine anwendung startet? wohl sone art front controller?

gruesse
 

kejo

Mitglied
hmm,
also, ich habe nun eine GUI Klasse:

Code:
import org.eclipse.swt.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;


public class Gui {

    Text output;
    
    public Gui() {
	init();
    }
    
    public void init()
    {

		Display display = new Display();
		Shell myShell = new Shell(display);
		GridLayout layout = new GridLayout();
		myShell.setLayout(layout);

		
		GridData gdata = new GridData(SWT.FILL,SWT.FILL,true,true);
		//Text 
		output = new Text(myShell,SWT.MULTI | SWT.BORDER);
		output.setLayoutData(gdata);
    }
}

Wie kann ich von einer anderen Klasse aus den Inhalt von "output" festlegen?
Also in der gleichen Klasse kann ich das ja mit

Code:
output.setText("String");

Aber wie mache ich das von woanders?

(Hintergrund: In der einen Klasse zerlege ich einen InputStream in einzelne Strings. Diese Strings will ich im Textfeld der GUI-Klasse darstellen lassen)[/code]
 

EOB

Top Contributor
du koenntest dir setter methoden machen. also

Code:
public void setYourText(String text){
    output.setText(text);
}

die dann von aussen aufrufen...waer das was?

gruesse
 

kejo

Mitglied
das wäre prima...nur wird bei mir einfach nichts ausgegeben im Textfeld output:

Main:

Code:
public class Main {

    public static void main(String[] args) {
	Gui gui = new Gui();
	gui.setYourText("Teststring");
    }

}

Gui:
Code:
public class Gui {

    Text output;
    
    public Gui() {
	init();
    }
    
    public void init()
    {

		Display display = new Display();
		Shell myShell = new Shell(display);
		GridLayout layout = new GridLayout();
		myShell.setLayout(layout);

		
		GridData gdata = new GridData(SWT.FILL,SWT.FILL,true,true);
		//Text 
		output = new Text(myShell,SWT.MULTI | SWT.BORDER);
		output.setLayoutData(gdata);
		myShell.open();
		while (!myShell.isDisposed()) 
		{
	          if (!display.readAndDispatch()) display.sleep();
	    }
    }
    public void setYourText(String text){
	    output.setText(text);
	} 
}
 

kejo

Mitglied
Also es liegt doch daran. Wenn ich diese Zeilen in setYourText() einbaue:


Code:
public void setYourText(String text){
       output.setText(text);

while (!myShell.isDisposed())
      {
             if (!display.readAndDispatch()) display.sleep();
       }

}

dann klappt es...aber das kann doch nicht die Lösung sein?
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben