Java JTree Problem

Schattenfänger

Lt. Junior Grade
Registriert
Nov. 2010
Beiträge
273
Hey, also ich sitze hier seit ca. 80h bei einem kleinen Projekt dabei, welches eigentlich schon ganz zufriedenstellend ist.
Jedoch habe ich die Gui getrennt geschrieben, sprich, JTree/TabbedPane/Area usw getrennt.
Jetzt wollte ich jTree hinzufügen und aus irgendeinem Grund - sei es weil ich es einfach nicht sehe oder verstehe bekomme ich in JTree nicht mehr meine Daten rein. Ich skizziere hier mal schnell wie man Aufabu bisher war.

Bisher:

Code:
MyTree{

public MyTree{

model = new InfoModel();
oadData(this.model.getData());
 tree = new JTree(root);

Und danach knapp 500Zeilen für Listener und das JFrame, auf dem ich den Tree gepackt habe.
Bis dahin hat alles wunderbar funktioniert!

Jetzt:

Code:
public MyTree extends JTree{

public MyTree(MyNode root) {
this.root = root;
this.tree=this;
Alles gleich geblieben, außer dass die Daten nicht mehr hier befüllt werden und kein JFrame erstellt wird.

Code:
public BaseGUI{

//gui zeugs halt

MyNode root = new MyNode(new MyFile("root"));
MyTree tree = new MyTree (root);
tree.loadData(this.model.getData());

Wenn ich mir die Methode loadData im Tree anschaue dann sehe ich genau, dass die Daten vom Model zu root hinzugefügt werden. Jedoch wird mir trotzalledem nur die Defaultwerte vom Tree angezeigt (color, sport, food)

Code:
public void loadData(List<MyFile> list) {
root.removeAllChildren();
         for (MyFile entry : list) {
			root.add(new MyNode(entry));
	}
	DefaultTreeModel model = (DefaultTreeModel) (this.getModel());
	model.nodeStructureChanged(root);
	}

Wäre wirklich schöön wenn mir jemand auf die Sprünge helfen kann, weil ich habe da noch knapp 15 andere Methoden die nur für Model - Tree Kommunikation sind, aber die brauche ich mir gar nicht erst anschauen, wenn nicht mal das laden von den Anfangswerten funktioniert.

Und ja, es ist alles an relevantem Code, da gibt es eigentlich nicht mehr, so fern sich Listener nicht auf den Inhalt auswirken.

Und eine Frage noch:
Wie ist es möglich von einer inneren Klasse auf die Instanz der äußeren zuzugreifen?
Sprich:
Code:
this.getSelectionModel().addTreeSelectionListener(
				new TreeSelectionListener() {
this würde in diesem Fall auf TreeSelectionListener referenzieren.
Ich habe es im Moment so gelöst, dass ich oben einfach sagte tree=this (also MyTree).
 
Vorher:
Code:
public MyTree(MyNode root) {
  tree = new JTree(root);
}
Nachher:
Code:
public MyTree(MyNode root) {
  super(); // machst du implizit
  this.tree=this;
}
Zum einen kannst du dir this.tree sparen, da du deine Klasse ja schon von JTree ableitest. Zum anderen machst du dem JTree den root(-Knoten) nicht (mehr) bekannt. Du arbeitest zwar in deiner Klasse damit, aber wenn das GUI-Element das Model nicht kennt, kann es die Daten darin auch nicht anzeigen.
 
Entschuldigung, aber ich stehe gerade etwas am Schlauch.

Das ich mir this.tree sparen kann ist klar, aber es handelt sich dabei nicht für den Tree selbst sondern, wie oben erwähnt, ist das die Variable für die innere Klasse TreeSelectionListener.

Zum anderen machst du dem JTree den root(-Knoten) nicht (mehr) bekannt
Ahh genau, ich habe ja in meiner Klasse nirgends denn root verwendet, sondern nur den "Standardroot" und denn habe ich ja mit meiner Methode nicht verändert.

Also: super(root);

Gibt es noch etwas hinzuzufügen?

(Muss jetzt mal die ~15 Methoden überarbeiten, ich bin mir sicher da kommt noch eine Frage auf :)
 
Schattenfänger schrieb:
Das ich mir this.tree sparen kann ist klar, aber es handelt sich dabei nicht für den Tree selbst sondern, wie oben erwähnt, ist das die Variable für die innere Klasse TreeSelectionListener.
Ah, jetzt sehe ich es. Da gibt es auch zwei andere Möglichkeiten.
1. Ohne Instanzvariable einfach dies schreiben:
Code:
final MyTree thisTree = this;
this.getSelectionModel().addTreeSelectionListener(
    new TreeSelectionListener() { ... }
2. Aufwändiger wäre eine eigene Klasse schrieben, die von TreeSelectionListener ableitet, der du MyTree im Konstruktor übergeben kannst.
 
Okay, danke aber ich mache es jetzt einfach mit MyTree.this.variable

Hätte da noch zwei Fragen :)

1.)
Wie am "besten" MVC realisieren?
Also, wie gesagt füge ich eben alle Komponenten auf einem Frame zusammen.
Üblich würde ich in der Main das Frame/Model/und Controller initialisieren. Dem Frame das Model übergeben und dem Controller beide.
Und im Frame Listener add Methoden und setMethoden bereitstellen, diese dann beim Controller "ausfüllen". Sobald es eine eingabe gibt, welche an den Controller weitergeleitet wird von dort dem Model sagen, was er machen soll und das Ergebnis dem Frame rückgeben.

So, jetzt habe ich aber dazwischen das Frame, wie soll ich das da machen? Weil ich habe die Daten ja praktisch im Tree, da ich die Objekte bereits darin habe und die angeklickten Daten würden dann in den entsprechenen Panels auf der TabbedPane angezeigt.
Soll ich nun meiner COmpleteGui das model übergeben und dann von dort weiter an den tree oder direkt an denn tree?


2.)
Ich habe ein Popupmenu beim Tree,diesem menü wird die Komponente übergeben auf welcher es angezeigt werden soll.
- Eben auf dem Tree.
So, nun ist das "aufgepoppte" menü so groß, dass es auch "auf" ein anderes Panel kommt, jedoch wird es dabei nicht angezeigt. Sprich ich sehe nur den Ausschnitt, der am Tree sichtbar ist, der Rest ist "verdeckt".
Wie kann ich jetzt vorgehen um das Ganze zu sehen?
Dem Tree die CompleteGui übergeben und von dort zum PopupMenü übergeben?
 
Zurück
Oben