Et me revoici!
Donc maintenant ce problème est résolu, mais j'ai un nouveau souci qui est, me semble-t'il, toujours en rapport avec le précédent.
En fait, les données que je stocke dans mon modèle sont représentées graphiquement à 2 endroits :
1) dans la JTreeTable stockant les informations des mes formes et groupes de formes.
2) sur une image où les groupes de formes sont représentés.
J'ai un système qui me permet de mettre en surbrillance la forme sur l'image lorsque la ligne de la JTreeTabl correspondante est sélectionnée.
Au départ, j'utilisais un KeyListener, un MouseListener et un MouseMotionListener pour détecter le changement de sélection.
Mais j'ai découvert récemment le ListSelectionListener.
Donc j'ai décidé de l'utiliser et de virer les autres listeners. Du coup, je fais ça :
1 2 3 4 5 6 7
|
treeTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent arg0) {
/** On propage le changement de sélection. */
fireSelectionChangedEvent(treeTable.getSelectedDefects(), (KeyEvent) null);
}
}); |
avec
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
|
public void fireSelectionChangedEvent(ArrayList selectedDefects, KeyEvent ke) {
/** On propage l'évènement aux listeners pour mettre à jour l'image. */
for (int i=0; i<listListener.size(); i++) {
((DefectTableListener) listListener.get(i)).defectTableSelectionChanged(selectedDefects);
}
/** On propage l'évènement clavier sur le tableau
* pour recentrer l'image sur la forme correspondante. */
TreeTableCellRenderer tree = (TreeTableCellRenderer) treeTable.getDefaultRenderer(TreeTableModel.class);
TreeSelectionModel treeSelectionModel = tree.getSelectionModel();
int treeRowsNumber = ((DefectNode) tree.getModel().getRoot()).getChildrenList().size();
DefaultListSelectionModel listSelectionModel = (DefaultListSelectionModel) treeTable.getSelectionModel();
int lead = listSelectionModel.getLeadSelectionIndex();
// J'ai dû rajouter ce test parce que sinon ça crachait...
if (lead <= treeRowsNumber) {
int selectedRow = lead;
if (selectedRow != -1) {
DefectNode dn = treeTable.nodeForRow(selectedRow);
if (dn != null)
fireDefectHighlightedEvent(dn.getDefect());
}
}
else {
/*
* On a supprimé des défauts => il y a une légère incohérence entre tree et treeTable :
* on a supprimé les noeuds, mais le ListSelectionModel de treeTable n'est pas tout à fait à jour
* apparemment...
*/
}
} |
Mais j'ai un souci lorsque par exemple je sélectionne toute ma JTreeTable et que j'appuies sur la touche "Suppr". Là ben forcément, j'essaie de supprimer toutes mes formes, mais ça crashe...
En fait, j'ai l'arbre qui sert de renderer à ma JTreeTable qui est bien à jour (les noeuds relatifs aux formes supprimées ont bien disparu => dans le cas de notre exemple, y'a plus de noeuds...), mais la méthode
listSelectionModel.getLeadSelectionIndex()
me renvoie 13 (autrement dit le numéro de la dernière ligne sélectionnée).
Donc il considère qu'il reste 13 ligne dans ma table, et la méthode
treeTable.nodeForRow(selectedRow);
crashe puisqu'elle cherche le 13ème noeud de l'arbre qui n'en compte plus aucun.
Donc je dois oublier d'appeler une méthode de mise à jour de ma JTreeTable ou je fais quelque chose qu'il ne faut pas, mais je ne vois pas quoi...
Quelqu'un aurait-il une idée?...
Partager