Toon posts:

[JAVA] TreeNode.add(TreeNode n) update JTree niet

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb het volgende probleem met DefaultMutableTreeNode. Ik heb een subclass van DefaultMutableTreeNode gemaakt. Deze heet ProjectTreeNode.

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
73
74
75
76
77
78
79
80
81
package com.fnv.trappenCalc.presentation.treeModel;

import com.fnv.trappenCalc.presentation.model.ProjectPresentationModel;
import com.fnv.trappenCalc.domeinModel.Merk;
import com.jgoodies.binding.PresentationModel;

import javax.swing.*;
import javax.swing.event.ListDataListener;
import javax.swing.event.ListDataEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeEvent;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class ProjectTreeNode extends AbstractTrapTreeNode  implements PropertyChangeListener, ListDataListener
{
    private Log logger = LogFactory.getLog(this.getClass());

    private ProjectPresentationModel projectModel;
    private com.fnv.util.jgoodies.binding.ListModel<Merk> merkenListModel;

    public ProjectTreeNode(ProjectPresentationModel m)
    {
        super("Project "+m.getProject().getProjectNummer(),true);
        this.projectModel = m;
        this.setMerkenListModel(this.projectModel.getMerkenListModel());
        this.projectModel.addPropertyChangeListener(PresentationModel.PROPERTYNAME_BEAN,this);
        this.buildChilderen();
    }

    public void propertyChange(PropertyChangeEvent evt)
    {
        if(evt.getPropertyName() == PresentationModel.PROPERTYNAME_BEAN)
        {
            super.setUserObject("Project "+this.projectModel.getProject().getProjectNummer());
            this.setMerkenListModel(this.projectModel.getMerkenListModel());
            this.buildChilderen();
        }
    }

    private void setMerkenListModel(com.fnv.util.jgoodies.binding.ListModel<Merk> lm)
    {
        if(this.merkenListModel != null)
            this.merkenListModel.removeListDataListener(this);


        this.merkenListModel = lm;
        this.merkenListModel.addListDataListener(this);

    }

    private void buildChilderen()
    {
        super.removeAllChildren();

        for(int i = 0;i < merkenListModel.size();i++)
        {
            Merk m = merkenListModel.get(i);
            super.add(new MerkTreeNode(m));
        }
    }

    
//*** Merken listmodel changed events
    public void intervalAdded(ListDataEvent e)
    {
        logger.debug("intervalAdded, merkenListModel, index = "+e.getIndex0()+".");
        super.add(new MerkTreeNode(this.merkenListModel.get(e.getIndex0())));
    }

    public void intervalRemoved(ListDataEvent e)
    {
        super.remove(e.getIndex0());
    }

    public void contentsChanged(ListDataEvent e)
    {
        //Todo : misschien children opnieuw aanmaken
    }
}


Deze klasse krijgt in de constructor een ProjectPresentationModel mee, hieruit haalt hij een lijst van merken, daarna registreerd de TreeNode zichzelf als ListDataListener op de merkenLijst.
Als ik aan deze lijst een merk toevoeg dan wordt intervalAdded netjes aangeroepen. Alleen de JTree wordt niet ge-update.
Moet ik zelf deze Tree update functionaliteit gaan implementeren? Of moet ik nieuwe TreeNodes via de TreeModel toevoegen?

Het builden van de children gaat wel goed, alleen wordt de TreeModel en dus ook de ProjectTreeNode aangemaakt voor het zetten van de TreeModel op de JTree.