JList

Signaler
Messages postés
519
Date d'inscription
mercredi 21 mars 2007
Statut
Membre
Dernière intervention
19 décembre 2016
-
Messages postés
2113
Date d'inscription
samedi 8 novembre 2003
Statut
Contributeur
Dernière intervention
6 octobre 2012
-
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

Messages postés
2113
Date d'inscription
samedi 8 novembre 2003
Statut
Contributeur
Dernière intervention
6 octobre 2012
11
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)