[java] JList doet het soms wel en soms niet

Pagina: 1
Acties:

  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 11-05 17:32
Ik heb een JList die zich absoluut niet aan de regels houdt. Hij is erg recalcitrant

Ik heb een custom list model die ik extend van DefaultListModel
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
public class EntityListModel extends DefaultListModel implements IPropertyChangeSupport
{
    private PropertyChangeSupport pcs;
    private boolean isLoaded = false;
    public EntityDTO entity;
    
    public EntityListModel(String name)
    {
        pcs = new PropertyChangeSupport(this,name);
    }
    
    public void setSelectedEntity(EntityDTO selectedDataModel)
    {
        EntityDTO oldValue = entity;
        entity = selectedDataModel;        
        pcs.firePropertyChange(PropertyChangeSupport.EVENT_ACTIVATE, oldValue, entity);        
    }
    
    public void addElement(Object obj)
    {
        super.addElement(obj);
        pcs.firePropertyChange(PropertyChangeSupport.EVENT_ADD,null,obj);
    }
    public boolean removeElement(Object obj)
    {
        boolean result = super.removeElement(obj);
        pcs.firePropertyChange(PropertyChangeSupport.EVENT_REMOVE,null,obj);
        return result;
    }

    public void addPropertyChangeListener(PropertyChangeListener pcl, String property)
    {
        pcs.addPropertyChangeListener(pcl,property);
    }

    public void removePropertyChangeListener(PropertyChangeListener pcl, String property)
    {
        pcs.removePropertyChangeListener(pcl,property);
    }

    public void removePropertyChangeListener(String property)
    {
        pcs.removePropertyChangeListener(property);
    }
    
    public boolean isLoaded()
    {
        return isLoaded;
    }
    
    public void setLoaded(boolean isLoaded)
    {
        this.isLoaded = isLoaded;
        pcs.firePropertyChange("loaded", false, true);
    }
}


nix mis mee zo te zien...doet het prima.
Dit list model wordt gevuld vanuit een runnable:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class FillExperimentListWorker implements Runnable
    {
        EntityListModel list;

        public FillExperimentListWorker(EntityListModel list)
        {
            this.list = list;
        }

        public void run()
        {
            try
            {
                ExperimentManagementDelegate management = new ExperimentManagementDelegate();
                for (Iterator i = management.getEntityList().iterator(); i.hasNext();)
                {
                    ExperimentDTO experimentDTO = (ExperimentDTO) i.next();
                    list.addElement(experimentDTO);                    
                }
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
            catch (Exception e)
            {

                e.printStackTrace();
            }
            list.setLoaded(true);
        }
    }


Doet ie ook prima, bij het debuggen staan er ook netjes items in de JList.

Met het maken van mijn JList specificeer ik netjes het model en renderer (innerclass renderer)
Java:
1
2
list.setModel(entityListModel);
list.setCellRenderer(new Renderer());


Soms laat hij de correcte data zien, en soms niet. Ik heb wel het idee dat hij iets doet, aangezien er een scrollbalk bij komt te staan.

Het maakt ook niet uit als ik geen renderer toeken. Hij zal dan de classe naam + geheugen adres moeten laten zien van de lijst, maar dat vertikt hij ook.

Anyone?

  • TukkerTweaker
  • Registratie: November 2001
  • Laatst online: 15-05 11:05
En de experimentDTO Objecten zijn niet null?

  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 11-05 17:32
Nope.., want als ik voor de addElement een println(experimentDTO) doe, dan krijg ik netjes een object terug

  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 11-05 17:32
Ok....dit is erg wierd! Heel erg wierd.

Bij deze code
code:
1
2
3
4
5
6
 for (Iterator i = management.getEntityList().iterator(); i.hasNext();)
                {
                    ExperimentDTO experimentDTO = (ExperimentDTO) i.next();
                    list.addElement(experimentDTO);      
                    Logger.info(this,experimentDTO.getUniqueNumber());
                }
let op de Logger

Krijg ik wel goede output.

Laat ik hem weg, dan doet hij het niet :S

  • TukkerTweaker
  • Registratie: November 2001
  • Laatst online: 15-05 11:05
Wat voor object is experimentDTO en heb je hier expliciet een toString() functie geimplementeerd of erft ie deze van een superclass.

  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 11-05 17:32
TukkerTweaker schreef op donderdag 27 januari 2005 @ 14:26:
Wat voor object is experimentDTO en heb je hier expliciet een toString() functie geimplementeerd of erft ie deze van een superclass.
ExperimentDTO is een DataTranferObject en deze erft van TrackedEntityDTO en die van EntityDTO en die van RelationDTO

Geen van alle hebben een ToString methode. Die staat dus in de class Object maar dat heeft nix te maken dat de JList het maar sporadisch werkt..

  • TukkerTweaker
  • Registratie: November 2001
  • Laatst online: 15-05 11:05
PhoneTech schreef op donderdag 27 januari 2005 @ 14:39:
[...]


ExperimentDTO is een DataTranferObject en deze erft van TrackedEntityDTO en die van EntityDTO en die van RelationDTO

Geen van alle hebben een ToString methode. Die staat dus in de class Object maar dat heeft nix te maken dat de JList het maar sporadisch werkt..
Het lijkt me niet een probleem van de JList implementatie maar meer in de objectvulling.

  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 15-05 20:04
Voeg je vaak veel objecten in sequentie toe aan de list?
Aangezien je het vullen van het model in een aparte worker thread doet en het repainten van de list via de event dispatching thread loopt, weet je zeker dat de JList wel de gelegenheid krijgt om zichzelf te repainten? Of vul je de lijst niet vanuit de event dispatching thread? Sowieso SwingUtilities.invokeLater() gebruiken voor het updaten van GUI components wanneer je met threads werkt.

[ Voor 62% gewijzigd door Kwistnix op 27-01-2005 15:38 ]

Pagina: 1