Comment fait on pour que à chaque ligne qui apparait dans la JTable, le scrollPane descend de maniere a ce que l'on voi toujours la derniere ligne crée..
Version imprimable
Comment fait on pour que à chaque ligne qui apparait dans la JTable, le scrollPane descend de maniere a ce que l'on voi toujours la derniere ligne crée..
Peut être en mettant le focus sur la dernière ligne que tu viens d'ajouter, enfin ça me paraît une bonne solution ;)
ou alors en faisantMais je sais pas si ça fonctionne.Code:
1
2 Jscrollbar bar = scrollpane.getVercticalScrollBar() ; bar.setValue( bar.getMaximumValue() ) ;
Salut,
Tu peux utiliser la méthode scrollRectToVisible() pour déplacer rendre visible une zone du composant, et getCellRect() pour obtenir les coordonnées de la zone correspondante à une cellule...
Enfin tu peux utiliser le TableModelListener pour détecter l'évènement d'ajout de ligne, par exemple :
Seulement il y a un petit problème : la JTable utilise également un TableModelListener pour détecter l'ajout de ligne... et donc notre listener peut être effectué AVANT que la ligne soit réellement affiché dans la JTable. Du coup on sélectionne la dernière ligne "juste avant" qu'une nouvelle ligne soit affiché : on dirait que le jscrollpane se déplace "seulement" sur l'avant dernière ligne...Code:
1
2
3
4
5
6
7
8
9
10 final JTable table = ... table.getModel().addTableModelListener(new TableModelListener() { public void tableChanged(final TableModelEvent e) { if (e.getType()==TableModelEvent.INSERT) { table.scrollRectToVisible( table.getCellRect(e.getLastRow(), 0, false) ); } } });
Pour régler cela il y a deux solutions :
- Il faut "retarder" le déplacement du JScrollPane, pour cela on peut utiliser invokeLater() pour remettre le code en "fin de pile" :arrow: on est sûr que tous les listeners seront exécutés lorsqu'on déplacera le JScrollPane :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 table.getModel().addTableModelListener(new TableModelListener() { public void tableChanged(final TableModelEvent e) { if (e.getType()==TableModelEvent.INSERT) { // On exécute le code plus tard : SwingUtilities.invokeLater(new Runnable() { public void run() { table.scrollRectToVisible( table.getCellRect(e.getLastRow(), 0, false) ); } }); } } });
- La seconde solution serait d'hériter de JTable pour lui incorporer cette fonctionnalité, tout simplement en redéfinissant sa méthode tablechanged() :
a++Code:
1
2
3
4
5
6
7
8
9
10
11
12 @Override public void tableChanged(TableModelEvent e) { // Ne pas oublier d'appeler le parent, // sinon les lignes ne seront pas ajoutées super.tableChanged(e); // Puis ajouter le code pour afficher la ligne if (e.getType()==TableModelEvent.INSERT) { this.scrollRectToVisible( this.getCellRect(e.getLastRow(), 0, false) ); } }
merci de toute ces soluce ca marche cool