[Maj]Thread+crash table:model pas mis à jour? => ListSelectionListener et JTreeTable
Salut!
J'ai un petit souci. En fait, j'utilise le composant JTreeTable disponible ici. Jusqu'à présent, je n'avais aucun problème, mais depuis que j'ai ajouté des threads pour exécuter les gros traitements, j'ai des crashes (pas critiques, mais embêtants) survenant sur la supression de noeuds. Il s'agit de crashes sur le repaint(), avec notamment des ArrayOutOfBoundException dû au fait que mon modèle ne doit pas être totalement à jour.
J'aimerai savoir comment me débrouiller pour être sûr que mon modèle est toujours à jour, et que ma JTreeTable a été prévenue des changements intervenus dans mon modèle.
Merci d'avance.
ListSelectionListener et JTreeTable
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 :
Code:
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
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
|
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
Code:
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
Code:
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?...