ListModel, ce n'est pas sale, parlons-en. - Java - Programmation
Marsh Posté le 23-12-2003 à 11:05:13
Ca a pas l'air très utile comme truc.
Le fait que ce soit trié n'apporte pas grand chose alors que si on avait un accès aléatoire à temps constant on pourrait faire de la recherche dichotomique.
Marsh Posté le 23-12-2003 à 13:51:24
J'ai été confronté au meme problème avec TableModel.
J'ai été obligé de faire une methode getObjectAtIndex(int i) dans ma liste d'objets faites sur un TreeSet. Cette méthode est complétement inutile en dehors de son contexte et est complétement absurde ais c'est la seule facon que j'ai trouvé.
Je fais aussi un parcours avec un Iterator mais c'est crade.
C'est le moyen le plus simple d'utiliser sans avoir a faire sa propre classe de liste ou tree et refaire tous les algo de parcours et de tris.
Marsh Posté le 23-12-2003 à 14:20:27
Supprimé, fausse bonne-idée.
Le ListModel ne doit être mis-à-jour *que* dans la tâche de répartition des événements de swing.
Marsh Posté le 23-12-2003 à 18:31:45
moi j'avait fait ca pour trié les elements :
Code :
|
Marsh Posté le 26-12-2003 à 02:35:02
nraynaud a écrit : Supprimé, fausse bonne-idée. |
Peux tu développer stp, je ne comprends pas très bien.
L'accès n'est pas une mise a jour
Marsh Posté le 26-12-2003 à 07:47:45
yo c spi a écrit : |
Imaginons qu'il y a une tâche qui met et enlève des éléments aléatoirement en permanence, une belle adaptation pour retarder les évènements dans la tâche de répartition des événements swing comme j'avais fait avant de comprendre que c'est peine perdue.
Pour peindre la liste, le ListUI fait la chose suivante (par défaut) :
- parcourir le ListModel pour chercher la plage de valeurs visibles (si on a pas mis de prototype)
- pour chaque valeur de la plage visible, obtenir un renderer et le peindre.
le parcourt se fait de la manière suivante :
- lire le nombre de valeurs dans le ListModel
- parcourir avec un int ces valeur (avec getElementAt())
Bien entendu, rien de tout ça ne "bloque" (avec synchronized) le ListModel, ce qui veut dire que si la tâche de mise-à-jour retire une valeur avant la fin du parcourt de la tâche de dessin, un ArrayOutOfBoundException va se lever, exactement ce qui m'est arrivé quand je me croyais malin avec mon ListModel synchronisé pour la notification des événements de mise-à-jour, mais pas des autres (tel un déplacement de la scrollbar, redimentionnement de la fenêtre etc.).
Marsh Posté le 01-01-2004 à 15:31:14
Code :
|
Le même avec une légère amélioration et des chiffres :
missed :255/28820 avoided resets : 183
il y a eu 28820 appels à getElementAt(), 255 ont donné lieu à un reset de l'iterateur (insertion/retrait d'éléments ou accès dans le désordre) et 183 reset ont été évités par le cache de la dernière valeur tirée de l'itérateur (c'est utile lorsqu'on scrolle vers le bas de la liste).
Je pense que c'est plutôt pas mal.
Marsh Posté le 23-12-2003 à 09:35:42
Je suis dans une application swing, et je suis confronté à des problèmes qui concernent tous ceux qui font du swing, je vais donc partager.
Première chose, les listes dont le éléments sont triés;
J'ai actuellement une implémentation fondée sur un TreeMap :
Elle est spécialisée pour des "Member" mais bon vous avez compris le principe.
La vue (ListUI) accède aux éléments, par leur indice, avec mon TreeSet dans une main et mon int dans l'autre, il faut convertir, la solution la plus simple consiste à parcourir un itérateur du set en comptant, quand on arrive au rang voulu, on renvoie la valeur de l'itérateur. Pour faire baisser un poil la complexité, et comme je sais que les indice sont accédés par plage contigües (j'ai testé) dans l'ordre croissant, je garde l'itérateur pour pas repartir de zéro à chaque requête.
si vous avez une idée pour l'améliorer, dites.
Il est possible d'avoir une complexité encore plus faible, mais ça nécessite de refaire toute la classe TreeSet pour y rajouter l'indexation, si quelqu'un de compétent en algo et en qualité veut bien faire ça en open-source, nous lui en serions tous reconnaissants.
Dans un esprit de partage, vous qu'avez-vous comme ListModel avec des services intéressant ?
Voiloù, j'aimerais qu'on arrive un peu à partager sur ce point (et peut-être des points connexes, tel les TableModels).
edit : enlevage d'une connerie, comme quoi se laver les dents c'est utile : ça fait réfléchir.
Message édité par nraynaud le 23-12-2003 à 09:44:52
---------------
trainoo.com, c'est fini