[Java] JTree reloaden heeft geen effect

Pagina: 1
Acties:

  • Johnny
  • Registratie: December 2001
  • Laatst online: 09:23

Johnny

ondergewaardeerde internetguru

Topicstarter
Ik heb een JTree die wordt opgebouwd (in createTree()) uit een ArrayList (topList), ieder item uit deze list krijgt een Node in de tree. Iedere topList bevat ook weer een lijst, (via getOtherList()) die ieder item daarin krijgt ook weer een eigen Node in die van TopList.

Dat komt er ongeveer zo uit te zien:

code:
1
2
3
4
5
TopList 1
 OtherList 1
 OtherList 2
topList 2
 OtherList 1


De inhoud/lengte van deze lijsten kan veranderen, als dit gebeurt is voordat de update() methode is aangeroepen wordt de tree opnieuw opgebouwd.

Dat het werkt zie ik aan de uitvoer in de command line.

Op het scherm veranderd er echter niets.

En als na deze verandering de methode getSelectedUserObject() aanroep door een node te selecteren in de tree krijg ik een NullPointerException omdat er geen LastSelectedPathComponent kan worden gevonden.

Om de tree te vernieuwen roep ik reload() aan op het model, maar dat heeft geen effect, ook allerlei andere suggesties op internet lijken niet te werken.

Java:
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
public void createTree() {
    
    JTreeController treeController = new JTreeController(this, dataModel);
    
    
    root = new DefaultMutableTreeNode("blaat");
    
    this.treeView = new JTree(root);

    DefaultTreeCellRenderer treeRenderer = new DefaultTreeCellRenderer();
    treeRenderer.setLeafIcon(null);
    treeView.setCellRenderer(treeRenderer);
    treeView.setEditable(true);
    
    treeModel  = new DefaultTreeModel(root);

    
    treeModel.addTreeModelListener(treeController);

    treeView.addTreeSelectionListener(treeController);
    
    for(int i = 0; i < topList.size(); i++) {
        

        DefaultMutableTreeNode topLevelNode = 
new DefaultMutableTreeNode(topList.get(i).toString());
        albumNode.setUserObject(topList().get(i));
        
        root.add(topLevelNode);
        System.out.println("adding toplist");

        //cycle trough the images in this album
        for(int j = 0; j < ((topList.get(i))).getOtherList().size(); j++) {

        DefaultMutableTreeNode bottomLevelNode = 
new DefaultMutableTreeNode(((topList.get(i))).getOtherList().get(j))).getName());
        imageNode.setUserObject(((topList().get(i))).getOtherList().get(j));
        albumNode.add(bottomLevelNode);
        
        System.out.println("  adding " + ((topList.get(i))).getOtherList().get(j))).getName());
        }
    }
    
    System.out.println("JTree created");
    }
    



 
    //geeft een NullPointer exception, nadat de tree is geupdate??
    public Object getSelectedUserObject() {

        return ((DefaultMutableTreeNode)treeView.getLastSelectedPathComponent()).getUserObject();
    }
    



    public void update(Observable observable, Object obj) {
     System.out.println("tree update received");
    if(dataModel.getTreeChanged()) {
        
        System.out.println("tree has changed");
        
        dataModel.setTreeChanged(false);
        //bouw de tree opnieuw op
        this.createTree();
        //ververs de tree - WERKT NIET!!!
       treeModel.reload(root);
    }
    }

(de code heirboven is ter illustratie,er zijn een heleboel dingen gestript waardoor er best wel wat haakjes zijn die niet meer kloppen, maar voor dit voorbeeld geeft dat niet)

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


Verwijderd

Sla de documentatie over Model-View-Controller (MVC) model er eens op na en implementeer de TreeModel interface om je data in de boom te krijgen. Dan kom je een eindje verder.

  • TukkerTweaker
  • Registratie: November 2001
  • Laatst online: 19-05 16:06
Weet je zeker dat de Tree niet gereload is? Misschien een revalidate op de bovenliggende container?

  • Eelke Spaak
  • Registratie: Juni 2001
  • Laatst online: 12-05 15:26

Eelke Spaak

- Vlad -

Ik heb ook ooit te maken gehad met een dergelijk probleem, met als enige verschil dat ik een eigen implementatie van TreeModel aan de JTree had gekoppeld.

De oplossing was vrij simpel (maar wellicht niet het elegantst):

Java:
1
2
TreeModel tm = new MyTreeModel();
tree.setModel(tm);


Hiermee tekent de JTree alle elementen automatisch opnieuw.

TheStreme - Share anything with anyone


  • Casteloni
  • Registratie: November 2001
  • Laatst online: 19-05 19:09
De code die je hier gepost hebt, van welke klasse is deze?
Verder heb je het nog over reload, als ik even in de API opzoek:
code:
1
2
3
4
5
6
reload

public void reload()

Invoke this method if you've modified the TreeNodes upon which this  
model depends. The model will notify all of its listeners that the  model has changed


De controller is dus je listener, als je het model verandert moet je via de controller ook de view aanpassen.

Misschien dat je aan deze tutorial nog wat hebt.