Comment faire défiler jusqu'à la dernière rangée dans un JTable
Je suis en train d'utiliser JTable
dans la voie où de nouveaux enregistrements de données sont ajoutées à la fin. La chose étrange est que la barre de défilement de ne pas aller au bout de la table; au lieu de cela, il montre toujours le deuxième à partir de la dernière. De toute façon, pour raconter la barre de défilement pour aller toujours au bout de la table?
Voici la partie de mon code:
table.scrollRectToVisible(table.getCellRect(table.getRowCount()-1, 0, true));
source d'informationauteur gd7
Vous devez vous connecter pour publier un commentaire.
Je viens de tomber sur ce problème - là est en fait rien de mal avec cette ligne de code; le problème, c'est lorsque vous exécutez.
Si vous êtes, comme moi, essayer de l'exécuter immédiatement après la manipulation de la TableModel (même par l'intermédiaire invokeLater) ou à l'aide d'un TableModelListenervous obtiendrez le problème que vous décrivez. Le problème est que, bien que le modèle a été mis à jour avec les nouvelles données (table.getRowCount() est tout simplement un pass-through à la getRowCount() méthode sur votre TableModel), le JTable composante visuelle n'a pas.
Lorsque vous exécutez cette ligne de code dans le précédemment décrit des lieux, vous êtes réellement en train de dire la JScrollPane (JTable.scrollRectToVisible reporte toute action à un parent qui peut fournir de défilement de comportement, par exemple JScrollPane) pour défiler jusqu'au-delà de la fin de la ci-joint JTable composant. Il refuse de le faire, et au lieu de cela défile jusqu'à la fin actuelle de l' JTable composant à la place.
À un moment plus tard, le JTable mises à jour du composant lui-même visuellement, et ajoute la nouvelle ligne sous la ligne défile plus tôt. Vous pouvez vérifier que la ligne de code qui fonctionne par ajout d'un bouton qui exécute indépendamment du code qui ajoute de nouvelles lignes, par exemple
La solution à ce problème est un peu indirecte, mais fonctionne de manière fiable dans mes tests. Parce que le problème réside dans le côté visuel de choses, j'ai décidé de raccordement dans le ComponentListener au lieu de cela, qui prévoit, entre autres choses, un componentResized méthode. Chaque fois qu'une ligne est ajoutée ou supprimée, le JTable redimensionne, même si elle ne peut pas être observé visuellement en raison de la JScrollPane de fenêtre d'affichage. Par conséquent, il suffit d'exécuter cette ligne de code dans cette méthode d'écouteur, et tout fonctionne comme prévu.
appeler cette méthode à chaque fois que vous voulez faire défiler vers le bas pour le bot de la table. Et le problème est résolu par l'utilisation de cette méthode.
Pourquoi ne pas appeler
fireTableRowsInserted
lors de la mise à jour de votreTableModel
mise en œuvre?Je usally avoir quelque chose comme ci-dessous dans mon TableModel mise en œuvre: