Bonjour,

je travail sur un composant amélioré du jxtreetable. Je cherche a obtenir un modele dynamique. j'entend par la la possibilité d'ajout de colonne.

une tite image pour exemple :



voici comment je procede pour cet ajout dynamique :

la methode d'ajout d'une colonne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
    public void addColumnModel(ITreeColumnModel model){
        columns.add(model);
        columnNames.add( model.getName() );
        setColumnIdentifiers(columnNames);
                model.getTableColumn().setModelIndex(columns.indexOf(model)+1);        
 
        tree.getColumnModel().addColumn(model.getTableColumn());
        tree.revalidate();
    }
une classe qui défnit un modele de colonne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
 
public class DefaultVisibleColumn implements ITreeColumnModel{
 
    private boolean edit = true;
    private TableColumn col = new TableColumn();
 
 
    public DefaultVisibleColumn() {
        ColumnHeader head1 = new ColumnHeader(TB.getString("col_visible"),new JLabel( IB.getIcon("open_eye") ));
        TableCellRenderer headerRenderer = new HeaderRenderer(head1);
 
        TableCellRenderer cellRenderer = new JContextTreeRenderer(new ButtonProvider()) ;
 
        col.setHeaderValue(head1);
        col.setHeaderRenderer(headerRenderer);
        col.setCellRenderer(cellRenderer);
        col.setResizable(false);
        col.setMaxWidth(25);
        col.setMinWidth(25);
        col.setPreferredWidth(25);
        col.setWidth(25);
    }
 
 
    public void setValue(Object target, Object value) {
        if(target instanceof MapLayer && value instanceof Boolean)
            ((MapLayer)target).setVisible((Boolean)value);
    }
 
    public Object getValue(Object target) {
 
        if(target instanceof MapLayer)
            return ((MapLayer)target).isVisible();
        else
            return "n/a";
    }
 
    public String getName() {
        return TB.getString("col_visible");
    }
 
    public boolean isEditable() {
        return edit;
    }
 
    public boolean isCellEditable(Object target){
 
         if(target instanceof MapLayer)
            return edit;
        else
            return false;
    }
 
    public void setEditable(boolean edit) {
        this.edit = edit;
    }
 
    public Class getColumnClass() {
        return Boolean.class;
    }
 
    public TableColumn getTableColumn() {
        return col;
    }
 
}

jai deux probleme :

1) quand on regarde l'image on voit que sur le popupmenu on ne peut pas désafficher les 2 colonnes (visible et symbole). de même si j'utilise une des actions en dessous, j'obtiens des erreurs. Ce qui me laisse a penser que la nouvelle colonne n'est pas bien inséré dans le modele.

2) le renderer a utiliser pour la nouvelle colonne est incorrect.
la classe TableColumn permet de définir des renderes classiques, mais ceux d'un jxtreetable sont différents, l'apparence (highlight...etc...) n'est donc pas correct.


le source complet est disponible en svn ici : http://subversion.developpez.com/pro...outil/v1/trunk