GUI

Status
Nicht offen für weitere Antworten.

Sqwan

Mitglied
Schönen guten Tag...

Also ich mir gestern abend mal was ausgedacht, was mich mal interessieren würde, da ich früher oder später auch mal in die Situation kommen könnte.

Fenster.jpg


Soa. Das Stellt jetzt mal ein belibiges Design dar. Wofür es sein könnte weiß ich im mom nicht, ich aber auch nicht so interessant, da es mich allgemein Interessiert.

So. Also der weiße Hintergrund soll mal ein Fenster darstellen. Die 2 schwarzen Rahmen stellen dann mal das Layout des Fensters dar. In diesem Fall würde ich es wahrscheinlich mit einem BorderLayout machen.

In den Teil WEST dieses Layout könnte nun eine Navigation rein, die vllt aus einem JTree oder aus einigen Buttons besteht (das rosane Rechteck). Der rechte teil sollte demnach also das hauptprogramm sein. Also füge ich dem rechten teil ein paar Aufgaben hinzu (ich nehme die jetzt mal aus dem bereich haushaltsplaner):
Also Konto, Kontogegenblatt, Inventar oder sonnst was.
Aus diesen bereichen soll natürlich per navigation ausgewählt werden. Jetzt hat jeder bereich eine eigene Klasse.

klickt man auf Konto wird im rechten Teil per add(new Konto()) etwas hinzugefügt.
Klickt man danach auf Inventar sollte eigendlich add(new Inventar()) gemacht werden.
Das funktioniert ja aber nicht, da der rechte bereich ja schon belegt ist.
Da stellt sich mir jetzt mal zuerst die Frage wie man nur den rechten bereich wieder frei gibt um was neues rein zu stellen (mit removeAll() geht ja alles weg).

So. Das wäre Problem nummer eins.
Wenn ich jetzt rechts ein per new Konto() etwa angefügt habe brauche ich auch im bereich WEST vllt auch eine neue Navi oder möchte der rechten navi noch etwas hinzufügen.
Problem nummer zwei: wie füge ich nun WEST ein neues Item hinzu. Ich habe ja aus der Konto-Klasse keinen zugriff auf den JTree.

So. Das Konto hat wie auf dem Bild zu sehen ist nun mehrere Bereiche. Oben irgendwas und unten eingabefelder mit Buttons. Und in der Mitte ist mir nichts mehr eingefallen. Jetzt mache ich ne methode die den oberen bereich macht und eine die die TextFelder macht. Jetzt möchte ich vieleicht den inhahlt der textfelder oben rein schreiben. Das geht nicht da die Methode ja nicht auf die Label des Oberen bereiches zugriff hat (Auser man nutzt Instanzvariablen). Den mittleren bereich möchte ich dann per Navigation den Mittleren bereich ändern. Was aber nicht geht da der mittlere Bereich wieder einer anderen Klasse gehört. Wenn ich ihn nun doch ändern könnte wäre auch wieder das Problem da, dass ich mit removeAll nur alles Wegmachen könnte.

Nun zum letzten teil. Wenn ich jetzt über den JTree etwas anlicke möchte ich vllt auch einen Text in das Textfeld der anderen klasse schreiben. Aber an das Textfeld komme ich ja noch weniger dran, da das Textfeld ein eigener Bestandteil der anderen Klasse ist.

Soa... Ich hoffe mal jemand versteht was ich meine.
Das hauptproblem ist, das ich gerne wissen würde, wie ich auch zwichen den Klassen auf die einzelnden Komponenten zugreifen kann, und wie ich einzelnde bereich in Layouten wieder neu beschreiben kann...

Ich hoffe mal mir kann da jemand helfen.

MFG Sqwan
 

Pappenheimer++

Bekanntes Mitglied
Hy, also zum ersten Problem: Die ganze Swing-Lib ist ja schön modular und hierarchisch aufgebaut und deshalb sollte es kein Problem sein, einen Teild er Oberfläche beizubehalten und einen anderen Teil zu ändern. Du nimmst einfach verschiedene Container (einen für die Navigation da links, einen rechts ...). Der Inhalt von diesen ist dann erstmal in sich geschlossen; da kannst du sogar jedem sein eigenes Layout zuweisen.
Was dein Problem mit der Kommunikation zwischen einzelnen GUI-Elemente angeht: Da sei dir das MVC-Konzept ans Herz gelegt. U.A. hier zu sehen http://java.sun.com/developer/technicalArticles/javase/mvc/
 

Sqwan

Mitglied
hmm... Irgendwie steige ich da nicht durch... Das ist ja super Komplizirt
Gibts da nicht vieleicht eine Vesion in leicht. Die auf für Anfänger funktioniert?

Also wie ich Werte zwichen Elementen verschieben kann etc weiß ich ja. Aber halt nur wenn die in einer Klasse sind.

Aber Problem 1 ist damit natür gelöst...

MFG Sqwan
 

André Uhres

Top Contributor
Sqwan hat gesagt.:
..Gibts da nicht vielleicht eine Version in leicht..
Wir könnten eine Klasse "Model" für die Daten machen,
eine Klasse "View" für die Swingkomponenten,
eine Klasse "Controller" für die Listener und eine Klasse "Main"
um die drei zu instanzieren. Da diese auch miteinander sprechen
müssen, sorgt "Main" ebenfalls für die nötigen Bekanntschaften,
z.B.: controller.setModel(model).
 

Sqwan

Mitglied
Hmmm... Okay...
Dann erkläre ich es mal. So als test ob ich da richtig liege oder ob ichs falsch verstanden habe (oder ob ich es garnicht verstanden habe).

Also ich habe eine Klasse View.
Da kommt für mein Beispiel jetzt rein:

Der JTree
Das Label oben
Unten die TextFelder
Kommt da auch das Grundgerüst rein?

Dann eine Klasse Model. Für die Daten.
Die Können z.b. Sein?
Vllt das was im JTree stehen soll?
Keine Anung was jetzt die Daten sein können.

Dann einer Controler Klasse für ActionListener oder MouseListener.
Naja... Das Verstehe ich auch nicht so 100%

bisher sah das bei mir immer so aus
Code:
JButton b = new JButton("lol");

ActionListener al = new ActionListener()
{
     public void actionPerformed(ActionEvent e)
     {
     //Hier soll was passieren
     }
}
b.addActionListener(al);
Deshalb weiß ich nicht so ganz wie das aussehen kann.

Naja.. Ich würde sagen in der Main würde ich nun ein Fenster erzeugen und mit der Klasse View kommponenten hinzufügen. Aber dann wüsste ich nicht wie ich an die Daten dran komme. Außer vllt die Datenklasse in der ViewKlasse zu Instanzieren. Und wie ich dann daten zurückgehend speichern soll.
Und "sorgt "Main" ebenfalls für die nötigen Bekanntschaften, "nist für mich leider auch schwer zu verstehen.

Soa... Vllt mal ein bischen zum vereinfachen:

Code:
class view 
{
	JLabel l;
	JTextField t;
	
	view()
	{
		l=new JLabel();
		t=new JTextField();
	}
}

class view2
{
	JButton iwas
	
	view2()
	{
		iwas = new JButton("Transfer");
	} 
}

class model
{
	String wort
	String wort2
	
	model()
	{
		wort="hm";
		wort2="Keinen Plan";
	}
}

Soa. Beim drücken des Buttons soll im Label der ButtonText stehen.
Und im TextFeld die Daten.
Jetzt muss das ja iwie über die Main-Funktion gemacht werden ( zumindest habe ich das so verstanden);
Code:
class controler extends/implements ActionListener 
{
}

Ich könnte mir vorstellen das die Iwie so aussieht. Aber nicht genau wie. Und auch nicht was da drinne stehen könnte.
Ich brauche ja eigendlich für jeden Button einen eigenen ActionListener, Sonnst kann ich ja nicht wissen von wo das Event kommt. Zumindest nicht wenn die Elemente mal den gleichen Text haben. Was grade in einem JTree ja vorkommen kann.

Trotzdem schon mal danke.
Ich glaube ich komme dem Ziel immer näher

MFG Sqwan
 

André Uhres

Top Contributor
> Kommt da auch das Grundgerüst rein?
ja

> Keine Anung was jetzt die Daten sein können.
Das können z.B. die Models der Swingkomponenten sein und irgendwelche anderen Daten, die du brauchst.

>Deshalb weiß ich nicht so ganz wie das aussehen kann.
button = new JButton(controller.actionXyz);

>Aber dann wüsste ich nicht wie ich an die Daten dran komme.
View muss eigentlich nur Controller kennen: view.setController(controller)
(um die Daten kümmert sich Controller).

> Und sorgt "Main" ebenfalls für die nötigen Bekanntschaften
Übergibt ganz einfach nur die entsprechenden Referenzen.
 

Sqwan

Mitglied
So... ich habe mich damit mal beschäftigt, jedoch weiß ich nicht wie man die listener hinzufügt.

in der main:

Code:
JButton b = new JButton("hallo");

in der Listener-Klasse

Code:
class controller implements ActionListener, MouseListener, KeyListener etc
{
      hier sind nun die einzelnden Listenermethoden drinne.
      actionPerformed
      mouseExited
      etc
}


Wie füge ich die Listener denn nun dem Button hinzu.
Der weiß ja nun nimmer was für ein Listener das ist. die sind ja jetzt alle in einer Klasse...

Kann mir da vllt nochmal jemand helfen?

MFG Sqwan
 
Z

zetagi

Gast
Sqwan hat gesagt.:
Hmmm... Okay...

Ich brauche ja eigendlich für jeden Button einen eigenen ActionListener, Sonnst kann ich ja nicht wissen von wo das Event kommt. Zumindest nicht wenn die Elemente mal den gleichen Text haben.

MFG Sqwan

Du kannst den Buttons mit "setActionCommand("OK")" eine Action-Bezeichnung geben. Anschließend kannst du dann in deiner actionPerformed(ActionEvent e)
dann die Events unterscheiden:

if(e.getActionCommand().equals("OK")){...}
if(e.getActionCommand().equals("ABBRUCH")){...}
if(e.getActionCommand().equals("HUGO")){...}
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben