Swing : JScrollPane n'a pas d'actualisation après les changements dans la structure d'un JTable
J'ai une JTable, associée à une DefaultTableModel, dans un Composite avec un SpringLayout qui est dans un JScrollPane.
Quand je modifie la structure de la DefaultTableModel avec la méthode ci-dessous la JTable est actualisé, mais pas le JScrollPane. - Je appliquer une deuxième fois cette méthode pour actualiser le JScrollPane.
public void updateProjectView() {
SwingProjectViewerController spvc = SwingProjectViewerController.
getInstance();
this.projectTitle.setText(spvc.getAcronym() + " : " + spvc.getTitle());
Object[][] tableContent =
spvc.getCriteria(CriteriaPreselectionController.getInstance().
getCriteriaPreselection());
Object[] columnsName = new Object[]{"Col1", "Col2"};
this.tableModel.setDataVector(tableContent, columnsName);
this.tableModel.fireTableStructureChanged();
}
Toute aide appréciée!
veuillez 1) vous n'avez pas mis à jour dans
Avez-vous essayé d'appeler
1) Par exemple, mon JTable contient un 2*15 tableau, la taille de la table est plus grande que la taille de récipient de panneau, donc il y a une barre de défilement sur mon JScrollPane. Après je mettre à jour le DefaultTableModel avec un 2*3 table, et je vois les changements dans la JTable qui est maintenant plus petit que le récipient de panneau. Si la barre de défilement doit disparaître, mais il ne le fait pas. Il a disparu quand j'applique la méthode un deuxième temps.
décrivant le problème n'a pas de sens (il doit se comporter comme vous vous attendez sans rien faire de spécial en plus du réglage de l'dataVector, aucun événement extérieur de la cuisson, pas dans/revalidation d'un composant) pour un SSCCE
JScrollPane
???, 2) mais comment pouvez-vous déterminer qui below the JTable is refreshed
Avez-vous essayé d'appeler
revalidate()
et peut-être repaint()
sur le JScrollPane de la fenêtre d'affichage? Si cela ne vous aide pas, envisager la création et la publication d'une sscce.1) Par exemple, mon JTable contient un 2*15 tableau, la taille de la table est plus grande que la taille de récipient de panneau, donc il y a une barre de défilement sur mon JScrollPane. Après je mettre à jour le DefaultTableModel avec un 2*3 table, et je vois les changements dans la JTable qui est maintenant plus petit que le récipient de panneau. Si la barre de défilement doit disparaître, mais il ne le fait pas. Il a disparu quand j'applique la méthode un deuxième temps.
décrivant le problème n'a pas de sens (il doit se comporter comme vous vous attendez sans rien faire de spécial en plus du réglage de l'dataVector, aucun événement extérieur de la cuisson, pas dans/revalidation d'un composant) pour un SSCCE
OriginalL'auteur Bastien_ | 2012-03-14
Vous devez vous connecter pour publier un commentaire.
Ici est un programme de test qui montre que, lorsqu'un JTable est occupé par un JScrollPane et la DefaultTableModel de DataVector est modifié via
setDataVector(...)
il n'est pas nécessaire de faire appel àfireTableDataChanged()
sur le modèle de la JTable de données pour modifier correctement et être affichés correctement.Le programme GUI ressemble à l'image ci-dessous.
Avant La Modification Des Données De:
Fois Que Les Données Ont Changé:
La carence de mon exemple ci-dessus, c'est qu'il ne permet pas de reproduire l'affiche originale du problème, et je pense que c'est grâce à nous, l'utilisation de SpringLayout, dont il n'est pas de décrire ou montrer le code:
Pour plus et mieux les aider, l'OP va avoir à créer sa propre sscce similaire (voire plus) que ce que j'ai posté ci-dessus. Soit ça, ou de résoudre son problème en n'utilisant pas SpringLayout de tenir la JTable mais plutôt soit l'ajouter directement à la JScrollPane de la fenêtre d'affichage de la vue ou de l'ajouter à un BorderLayout l'aide d'un Composite (en prenant soin d'ajouter aussi de la JTable en-tête) et l'ajouter à la JScrollPane de la fenêtre d'affichage de la vue.
Plein D'Anguilles je n'avais pas vu cette réponse +1
heureux, il a aidé. Chaque fois que vous rencontrez des problèmes similaires, il est souvent préférable d'essayer d'isoler le problème autant que possible car il simplifie son débogage, et si cela échoue, vous aurez au moins avoir une petite compilalble programme de poster ici.
A fonctionné pour moi avec un problème similaire. Pour les autres utilisateurs qui n'ont pas ce problème, essayez de restructurer votre classe pour permettre à vous le relatif " setModel()' méthode. Personnellement, j'ai été en utilisant JXTreeTable, et il m'a fallu un certain temps pour trouver setTreeTableModel(), attend setModel (), avoir été écrasé par le JXTreeTable classe.
OriginalL'auteur Hovercraft Full Of Eels
J'ai rencontré ce problème avant.
Essayer d'invalider la JTable et de repeindre le JScrollPane.
Ces appels ne sont pas aléatoires. Elles sont spécifiques à ce que je pense que l'OP est en train de faire. Normalement, vous repeindre un composant Swing que vous modifiez. Depuis JScrollPane est un composant conteneur, lorsque vous modifiez la JTable, vous devez repeindre le conteneur.
Normalement, vous repeindre un composant Swing que vous modifiez non, pas du tout. Normalement le composant repeint/revalidation lui-même sur les changements. Si cela ne se produit pas automatiquement, quelque chose cloche, soit dans le code client ou dans le noyau. Là où il est, il a besoin d'une bonne piste vers le bas au lieu de la peinture sur 😉
OriginalL'auteur Gilbert Le Blanc
Essayez d'appeler revalidate() la méthode sur la table. Selon la spécification de JScrollPanel http://docs.oracle.com/javase/tutorial/uiswing/components/scrollpane.html#update - "l'évolution dynamique du client de taille" cette méthode doit aviser Panneau de Défilement.
OriginalL'auteur npenkov