Toon posts:

Java: JTree i.c.m. MVC-pattern

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo

Mijn doel: Een JTree die door de gebruiker door middel van een knopje is te veranderen (elementen toevoegen/verwijderen). Tevens moet het MVC-pattern zijn toegepast.

Tot nu toe: Ik ben al dagen bezig om dit voor elkaar te krijgen, maar het lukt niet. Volgens mij moet er een treeModel worden toegepast.
Ik heb het volgende:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
tree = new JTree(top);
DefaultTreeModel treeModel = new DefaultTreeModel(top);
....
DefaultMutableTreeNode category = null;
DefaultMutableTreeNode node2 = null;

node2 = new DefaultMutableTreeNode(new NodeInfo
                    ("blaat",
                    "temp.html"));
treeModel.insertNodeInto(node2,top,0);
tree.setModel(treeModel);
....


private class NodeInfo {
        public String nodeName;
        public URL nodeURL;
        private Object list;

        public NodeInfo(String node, String filename) {
            nodeName = node;
            nodeURL = TreeView.class.getResource(filename);
            if (nodeURL == null) {
                System.err.println("Couldn't find file: "
                                   + filename);
            }
        }
        
        public String toString() {
            return nodeName;
        }
    }
Bij mijn huidige code zit alles in de View-klasse en het werkt alleen bij het compilen. Zodra het draait, is de tree niet meer aan te passen.

Hoe kan ik er nou voor zorgen dat de data van de tree in een andere klasse is dan het weergeven ervan, maar dat het toch door de gebruiker kan worden aangepast?

  • DaRKie
  • Registratie: December 2001
  • Laatst online: 12-02 09:57
In het kort wat jet moet doen:
- Je controller class gaat de input van de gebruiker opvangen (=user drukt op knop)
- de controller class gaat dan user input opvragen en toevoegen aan het model (=data die in de tree getoond moet worden)
- dan gaat hij de view laten weten dat het model aangepast is. De view gaat dan de tree reloaden.

  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 12:42
Afbeeldingslocatie: http://people.zeelandnet.nl/jelleklap/mvc.gif

Je kan handig gebruik maken van de standaard Observer interface en de Observable klasse van Java om het Observer pattern toe te passen.
Je View en Controller registeren zich dan bij het Model en zodra het Model veranderd wordt automatisch de update() methode in alle geregistreerde Views / Controllers aangeroepen, die op hun beurt de nieuwe gegevens in het Model gaan raadplegen en daarmee doen wat ze moeten doen.
Het model kan je ook de TreeModel interface laten implementeren, zodat je het direct als basis voor de JTree kan gebruiken.

Verwijderd

Topicstarter
Ik heb het volgende, maar hij blijft NullPointerExceptions uitspugen.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//(constructor van model)
OrganiserModel() { 
    root = new DefaultMutableTreeNode("Categorieen",true);
    DefaultTreeModel treeModel = new DefaultTreeModel(root);
    System.out.println("Model aangemaakt");
}
....
public DefaultTreeModel getTreeModel() {
    return treeModel;
}
    
public void addNode(String categoryName, DefaultMutableTreeNode parent) {
    DefaultMutableTreeNode node = null;
    node = new DefaultMutableTreeNode(new NodeInfo
                (categoryName,
                "temp.html"));
    treeModel.insertNodeInto(node,parent,0);
}

code:
1
2
3
4
5
6
//View-klasse
treeModel = model.getTreeModel();
tree = new JTree(treeModel);

model.addNode("poep",top);
treeModel = model.getTreeModel();

Hij geeft een NullPointerException bij de regel: treeModel = model.getTreeModel();. Ik weet zeker dat de model wordt aangemaakt (teststring in de constructor wordt weergegeven).

In de main-klasse heb ik:
code:
1
2
3
OrganiserModel model = new OrganiserModel();
TreeView treeView = new TreeView();
treeView.initialize(model);

Deze methode uit het MVC-principe is zoals ze moet zijn (heb er niks bijzonders mee gedaan). Initialize houdt in dat ie een verwijzing naar model bijhoudt in een variabele.

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 12-02 15:05

Robtimus

me Robtimus no like you

Verwijderd schreef op zaterdag 21 oktober 2006 @ 11:22:
In de main-klasse heb ik:
Java:
1
2
3
OrganiserModel model = new OrganiserModel();
TreeView treeView = new TreeView();
treeView.initialize(model);
Volgens mij declareer je hier een nieuwe variabele van type OrganiserModel ipv je class variable (field) te gebruiken.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Verwijderd

Topicstarter
Ik snap eerlijk gezegd niet helemaal wat je bedoelt. :$ De bedoeling is dat er een OrganiserModel wordt aangemaakt en dat een referentie daarnaar wordt meegegeven aan TreeView.

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 12-02 15:05

Robtimus

me Robtimus no like you

Laat je initialize() code eens zien, en de fields van TreeView.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Verwijderd

Topicstarter
code:
1
2
3
4
5
public void initialize(OrganiserModel model) {
    this.model = model; 
    model.attach(this); 
    treeController.initialize(model,this);
}

Velden:
code:
1
2
3
4
JTree tree;
TreeController treeController;
OrganiserModel model;
...enz

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 12-02 15:05

Robtimus

me Robtimus no like you

Daar zie ik eerlijk gezegd niets mis mee. Een veelgemaakte fout is dat men in zo'n method of een constructor het volgende doen:
Java:
1
2
3
4
5
6
7
private JTree tree;

public Constructor(..) {
    ...
    JTree tree = new JTree(...); // moet zijn (this.)tree = new JTree(...);
    ...
}
Dan is het logisch dat je een NPE krijgt als je veld tree probeert te gebruiken omdat die nooit geinitialiseerd is.

Anyway, ik weet het even niet meer helaas... Tenzij je ergens je model weer op null zet.

[ Voor 4% gewijzigd door Robtimus op 22-10-2006 20:57 ]

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 12:42
Verwijderd schreef op zaterdag 21 oktober 2006 @ 11:22:

Java:
1
2
3
4
5
6
//(constructor van model)
OrganiserModel() { 
    root = new DefaultMutableTreeNode("Categorieen",true);
    DefaultTreeModel treeModel = new DefaultTreeModel(root);
    System.out.println("Model aangemaakt");
}
De NPE treedt waarschijnlijk op, omdat je de instantie variabele treeModel niet initialiseert in de constructor van OrganiserModel, maar in plaats daarvan een lokale variabele aanmaakt. De instantie variabele blijft dus null, vervolgens geef je een referentie naar het ongeïnitialiseerde object door aan de View en Controller klasse zodra je de getTreeModel() methode aanroept. Zodra je iets met die referentie doet treedt de NPE op. Precies wat IceManX zegt dus :)

[ Voor 9% gewijzigd door Kwistnix op 23-10-2006 09:18 ]


Verwijderd

Topicstarter
Ik heb het volgende, maar de fout blijft:
Java:
1
2
3
4
5
6
7
8
9
10
public class OrganiserModel {

DefaultTreeModel treeModel;
DefaultMutableTreeNode root;
        
OrganiserModel() { 
    root = new DefaultMutableTreeNode("Categorieen",true);
    treeModel = new DefaultTreeModel(root);
    System.out.println("Model aangemaakt");
}

  • DaRKie
  • Registratie: December 2001
  • Laatst online: 12-02 09:57
Je moet toch echt wel in staat zijn om een simpele npe op te lossen? Met enkel fragmenten uit classes is het heel moeilijk voor ons om meteen te pinpointen waar het fout gaat. Verschillende mensen hebben al gezegd wat de oorzaak kan zijn. Het enige wat jij nu moet doen, is het pad volgen van de variabele die voor de exception zorgt en kijken waar hij (niet)geinitialiseerd wordt.

Met een goede ide kan je gemakkelijk de stacktrace volgen die de exception uitspuwt.

Kan je trouwens eens de volledige stacktrace posten? Misschien staat er wel iets in dat jij over het hoofd ziet of verkeerd interpreteert. Als je het echt niet vind, zet je 3 classes anders eens ergens online zodat we de gehele code kunnen bekijken.

Verwijderd

Topicstarter
Ben opnieuw begonnen met zo min mogelijk zaken er in (alleen de basis). Heb de code maar online gezet. Kan het probleem niet vinden (zal wel een of ander lullig dingetje zijn...)

OrganiserModel
TreeView
SelfOrganiser
TreeController


Ik weet het probleem al :$ ; het model wordt opgevraagd voordat de hele mvc-structuur is opgebouwd.

[ Voor 9% gewijzigd door Verwijderd op 24-10-2006 16:31 ]

Pagina: 1