JList

cs_jojolemariole Messages postés 519 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 19 décembre 2016 - 19 juil. 2007 à 11:08
cs_GodConan Messages postés 2113 Date d'inscription samedi 8 novembre 2003 Statut Contributeur Dernière intervention 6 octobre 2012 - 19 juil. 2007 à 13:34
Cette année, en M1, nous avons développé dans un groupe d'environ 10 étudiants une application qui compile, exécute et anime des algorithmes Animalgo . Je suis actuellement en stage pour régler quelques détails avant sa mise en service, on l'espère pour l'enseignement. Bref.

Comme notre langage permet la création de plusieurs processus (synchronisés par des sémaphores), nous avons souhaité pouvoir animer l'état des processus grâce à une JList

http://www.servimg.com/image_preview.php?i=29&u=11220143

La JList est un Observer qui est mise à jour à chaque fois que l'engine exécute une instruction. Lors d'une mise à jour, on efface le DefaultListModel, on le rempli avec les nouvelles données, puis on appelle repaint()

Sauf, qu'avec une vitesse d'exécution élevée, on a une erreur qui ressemble à ça :

Exception in thread "AWT-EventQueue-1" java.lang.ArrayIndexOutOfBoundsException: 2
    at javax.swing.plaf.basic.BasicListUI.updateLayoutState(Unknown Source)
    at javax.swing.plaf.basic.BasicListUI.maybeUpdateLayoutState(Unknown Source)
    at javax.swing.plaf.basic.BasicListUI.getPreferredSize(Unknown Source)
    at javax.swing.JComponent.getPreferredSize(Unknown Source)
    at javax.swing.ScrollPaneLayout.layoutContainer(Unknown Source)
    at java.awt.Container.layout(Unknown Source)
    at java.awt.Container.doLayout(Unknown Source)
    at java.awt.Container.validateTree(Unknown Source)][]
    at java.awt.Container.validate(Unknown Source)
    at javax.swing.RepaintManager.validateInvalidComponents(Unknown Source)
    at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

C'est pas évident à debugger vu que c'est ma première "grosse application", mais je pense qu'il s'agit d'un problème de synchronisation, le repaint() du JList doit faire appel au DefaultListModel, et vu que le repaint() est lancé dans un l'EDT, je pense qu'un 2è update survient entre-temps et vide à nouveau le DefaultListModel pendant que le repaint() s'exécute, d'où l'exception

j'ai essayé de synchroniser avec tous les outils possibles mais en y réflechissant, ça ne sert à rien, vu que de toute façon, le repaint() se fait en parallèle dans l'EDT

y'a t-il moyen de déclencher automatiquement une méthode quand le repaint est vraiment terminé?

je précise que ça ne me dérange pas que tous les repaint() ne soient pas exécutés

1 réponse

cs_GodConan Messages postés 2113 Date d'inscription samedi 8 novembre 2003 Statut Contributeur Dernière intervention 6 octobre 2012 12
19 juil. 2007 à 13:34
tu peu synchronize ton repaint sur le model de donné je pense!!
Autrement plutot que d effacer ton model et le refaire ! en faire un adapter a vos besoin serait surment plus interressant et un listener sur les donné pourrai déclencher un repaint() le moment venu ...

GodConan ;o)
0
Rejoignez-nous