2010-02-12 7 views
7

Actuellement, j'utilise un TreeCellRenderer personnalisé pour gérer les modifications d'étiquettes et d'icônes pour mon JTree. Le problème vient quand j'ai besoin de changer le texte sur quelques nœuds. Le TreeCellRenderer fonctionne très bien en ce que le nouveau texte est affiché. Cependant, la largeur du texte initial est mise en cache et n'est pas mise à jour. J'ai tenté de le pirater en remplaçant getPreferredSize dans le TreeCellRenderer mais cela ne fonctionne pas correctement car j'ai des chaînes html. J'ai même essayé d'analyser les tags et d'obtenir la largeur, mais ce n'est toujours pas parfait. J'ai utilisé SwingUtilities et FontMetrics.Les étiquettes de nœuds JTree changent souvent mais la largeur est mise en cache

Il semble que l'utilisation du support DefaultTreeModel.nodeChanged (TreeNode) de l'arborescence est la méthode appropriée pour modifier un nœud. Cependant, j'aurais besoin d'une structure de données supplémentaire pour gérer l'accès aux nœuds qui doivent être changés. Personnellement, je voudrais seulement changer les nœuds qui ont besoin d'être changés. Mais, cela nécessiterait une autre structure de données pour trouver tous les nœuds qui ont besoin d'être mis à jour un peu. Quelle est la meilleure façon de contourner la taille de cache de JLabel dans cette situation?

+0

J'ai été en mesure de résoudre ce problème par JTree.setLargeModel (true) les docs disent que cela désactive une grande partie de la mise en cache. Mais il avertit également que toutes les interfaces ne le supportent pas. Je l'ai juste essayé dans plusieurs LnF ainsi que sur Linux et Windows. Ça me va bien. Des pensées? – initialZero

Répondre

2

J'ai trouvé que le fait d'utiliser nodeChanged de la manière que vous avez suggérée a fonctionné le mieux pour moi.