Préserver JTable dans TableModel changement
Nous voyons JTable
sélection obtenir effacée lorsque l'on fait un fireTableDataChanged()
ou fireTableRowsUpdated()
de la TableModel
.
Est-ce prévu, ou sommes-nous fait quelque chose de mal? Je ne vois pas bien sur la JTable
(ou d'autres classes), à propos de la compensation/la préservation de la sélection sur le modèle des mises à jour.
Si c'est le comportement par défaut, est-il un bon moyen pour éviter cela? Peut-être que d'une certaine façon à "verrouiller" la sélection avant la mise à jour et déverrouiller après?
Le développeur a fait des expériences avec enregistrement de la sélection avant la mise à jour et ré-appliquer. C'est un peu lent.
C'est Java 1.4.2 sur Windows XP, si ce qui compte. Nous sommes limitée à la version basée sur certains vendeur code que nous utilisons.
OriginalL'auteur John M | 2008-10-31
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin pour préserver la sélection, puis les ré-appliquer.
Tout d'abord, vous aurez besoin d'obtenir une liste de toutes les cellules sélectionnées.
Puis, quand vous chargez de nouveau le JTable avec les nouvelles données que vous avez besoin de programmation pour ré-appliquer ces mêmes sélections.
L'autre point que je veux faire est, si le nombre de lignes ou de colonnes de votre tableau hausse ou à la baisse après chaque modèle de table de rechargement, alors s'il vous plaît ne prenez pas la peine de préserver la sélection.
L'utilisateur pourrait avoir sélectionné la ligne 2, colonne 1, ayant une valeur dire "Canard", avant que le modèle de mise à jour. Mais après le modèle de mise à jour que même les données peuvent maintenant se produire sur la ligne 4, colonne 1, et l'original de votre cellule de la ligne 2, colonne 1, pourrait avoir de nouvelles données telles que "Cochon". Maintenant, si vous forcez l'ensemble de la sélection pour ce qu'il était avant le modèle de mise à jour, cela peut ne pas être ce que l'utilisateur voulu.
Donc par programme en sélectionnant des cellules pourrait être une épée à double tranchant. Ne pas le faire, si vous n'êtes pas sûr.
OriginalL'auteur Swapnonil Mukherjee
Vous pouvez automatiquement préserver une table de sélection si la STRUCTURE de cette table n'a pas changé (c'est à dire si vous n'avez pas à ajouter/supprimer des colonnes/lignes) comme suit.
Si vous avez écrit votre propre mise en œuvre de TableModel, vous pouvez simplement remplacer le fireTableDataChanged() méthode:
et cela devrait s'assurer que votre sélection est maintenu à condition que les seules données et non pas à la structure de la table a changé. La seule différence entre le présent et ce qu'on pourrait appeler si cette méthode n'est pas remplacé, c'est que getRowCount() - 1 est passée pour la lastRow argument au lieu d'un Entier.MAX_VALUE, dont le dernier les actes d'un signifiant qui a non seulement toutes les données dans la table changé, mais que le nombre de lignes peut avoir ainsi.
Ne serait-ce pas structureChanged alors?
non, un structureChanged est lorsque les colonnes sont modifiés avec les données
Tu veux dire les colonnes et/ou lignes droite? Et par les insertions/suppressions voulez-vous dire l'ajout de colonnes et/ou lignes ou quelque chose d'autre? Désolé suppose que je suis encore un peu confus, mais il semble que ce que vous dites ici, c'est vraiment important pour moi de comprendre
oui, la doc api de l'evénement à feu n'est pas trop clair: faire comprendre que nous avons à lire attentivement ces deux AbstractTableModel.fireXX méthodes et TableModelEvent 😉 Un tableModel de la structure == ensemble de colonnes, de sorte que chaque fois qu'une colonne est supprimée/inséré (ou même déplacé) structureChanged doit être tiré. Insérer/supprimer/mettre à jour pour unique délimitée plages sont évidentes. Un changement qui inclut dur-à-express (en termes de simples blocs) insertions/supprime devez tirer une dataChanged
OriginalL'auteur Peter Berg
C'est le comportement par défaut. Si vous appelez
fireTableDataChanged()
l'ensemble de la table est à reconstruire à partir de zéro comme vous le jeu entièrement nouveau modèle. Dans ce cas, la sélection est, naturellement, perdu. Si vous appelezfireTableRowsUpdated()
la sélection est également désactivée dans les cas généraux. Le seul moyen est de se rappeler de sélection, puis de définir cette. Malheureusement, il n'existe aucune garantie que la sélection sera toujours valide. Attention, si la restauration de la sélection.OriginalL'auteur Rastislav Komara
de référence, comme @Swapnonil Mukherjee, a déclaré, de ce fait le truc avec une table avec une sélection de lignes:
OriginalL'auteur Exceptyon
Si je me souviens bien, l'enregistrement de sélection et de l'application c'est ce que nous avons fait trop...
OriginalL'auteur PhiLho
J'ai eu le même problème dans une application. Dans mon cas, le modèle de la table a été une liste d'objets, où les propriétés de l'objet où mappés à des colonnes. Dans ce cas, lorsque la liste a été modifiée, j'ai récupéré l'index sélectionné et stocké l'objet qui a été sélectionné avant la mise à jour de la liste. Après la liste est modifiée et avant la table est mise à jour, je voudrais calculer la position de l'objet sélectionné. S'il en était encore présent après la modification, alors je l'ensemble de la sélection pour le nouvel indice.
La seule définition de l'index sélectionné dans la table après la modification ne fonctionnera pas, parce que l'objet peut changer de position dans la liste.
Comme une note de côté, j'ai trouvé que le fait de travailler avec GlazedLists rend la vie beaucoup plus facile lorsque vous traitez avec des tables.
OriginalL'auteur Mario Ortegón
J'ai été confronté à la même question et quand j'ai essayé de chercher la raison pour laquelle je suis à cette question, mais il semble un bug dans le SDK Java. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4276786
CONTOURNER
Une solution provisoire est disponible. Il doit être retiré une fois ce bug est corrigé comme il l'aptitude n'a PAS été testé contre les fixes de presse.
Utilisation de la présente sous-classe de la JTable.
Note: C'est pour la MetalLookAndFeel. Si vous utilisez un autre look et les sensations de l'intérieur FixedTableUI sous-classe d'élargir le TableUI sous-classe pour que le regard et le sentir.
Note faire la Révérence à http://bugs.sun.com
OriginalL'auteur Ram Dutt Shukla