[Java] Object in JComboBox

Pagina: 1
Acties:

  • josteman
  • Registratie: Mei 2002
  • Laatst online: 21-12-2022
Is het mogelijk om naast een text waarde (welke zichtbaar is voor de gebruiker) ook een object in een JComboBox te plaatsen.
Ik wil namelijk een naam weergeven (bv "Jan") en ik wil het object persoon (waarin zijn adres enz staan) erbij zetten zodat als er op Jan is gedrukt ik dat object kan raadplegen

Groeten Josteman

Boei


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Dat is niet alleen mogelijk maar zelfs juiste manier van werken. Je moet dan toString van dat object wel aanpassen of nog beter, de Renderer van de combobox aanpassen (klinkt heftig.. is het niet). Hiermee kan je perfect aansturen wat er in de combobox komt te staan. Je hoeft dan niet een string er ook nog een keer naast te plaatsen, dat object is dus voldoende!

Kijk ook even naar de combobox model (een model voor de combobox waarin jij je objecten kan plakken) en naar de listcellredenerer

code:
1
2
3
4
5
6
7
8
class PersoonListCellRenderer extends DefaultListCellRenderer{
       Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
             super. getListCellRendererComponent(list,valie,index,....);
             Persoon p = (Persoon)value;
             setLabel(p.getVoornaam()+" "+p.getAchternaam());
             return this;
      }
}


Die DefaultListCellRenderer extends van een JLabel en dat is dus ook het component wat je terug krijgt van die super aanroep. En daarop doe je nog even een extra setLabel zodat jij jouw tekst erin krijgt.

[ Voor 63% gewijzigd door Alarmnummer op 16-02-2004 14:33 ]


  • josteman
  • Registratie: Mei 2002
  • Laatst online: 21-12-2022
Ik heb een toString() functie die de naam returnt, maar hij geeft geen waardes weer in de combobox.

Boei


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

josteman schreef op 16 februari 2004 @ 14:29:
Ik heb een toString() functie die de naam returnt, maar hij geeft geen waardes weer in de combobox.
Staan er wel items in die combobox? dus voeg dit eens toe:

System.out.println(combobox.getModel().getSize());

En kijk hoeveel items erin zitten.

de toString kan je beter niet aanpassen van een object. Ik gebruik toString over het algemeen alleen voor debugging doeleinden, dus je mag er nooit van uit gaan dat het er mooi uitziet. Check mijn voorbeeld met de renderer eens.

  • josteman
  • Registratie: Mei 2002
  • Laatst online: 21-12-2022
hmm volgens mij ben ik er bijna, maar nu zet hij de eerste waarde er 3 keer in.
Ik gebruik nu

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class ComboPersoonextends JComboBox implements  ListCellRenderer
{
  public ComboPersoon()
  {
  }

     public Component getListCellRendererComponent(
         JList list,
         Object value,
         int index,
         boolean isSelected,
         boolean cellHasFocus)
     {
       Persoon pPers = (Persoon ) value;

       addItem(pPers.adres + " - " + pPers.huisnummer);
       return this;
     }
}


Echt simpel vind ik het niet in ieder geval.

Boei


  • josteman
  • Registratie: Mei 2002
  • Laatst online: 21-12-2022
Ha ik heb hem, bedankt he.
Alleen nu nog uitlezen...

Boei


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Ik zie een aantal enge dingen:

1: implementeer bijna nooit een interface op een class. Of maak gebruik van een internal class waarvan het alleen de taak is om die interface te implementeren. Dit werkt overzichtelijk (tenslotte heb je alle troep bij elkaar) en verder kan er namelijk bij jou nog iets fout gaan. Stel dat er een methode is van de parent die jij nu loopt te overriden.. dan werkt het niet zoals het zou moeten. Stel nu dat deze methode er nog niet is.. maar hij komt er nog wel een keer bij.. dan gaat die methode dus nooit aangeroepen worden. Of maak gebruik van een extern object.

Verder kan je ook beter van de DefaultListCellRenderer extenden omdat de meeste grafische romslomp al is gedaan. Alleen de tekst nog even aanpakken... en dan ben je klaar.

2: ik zie pPers.adres pPers.huisnummer staan. Tenzij Sun toch stiekum property syntax heeft toegevoegd (wat ze dus niet hebben gedaan) maak jij hier gebruik van publieke velden (huisnummer en adres). Dit is in de oo -wereld not done. Check het forum maar eens waarom publieke velden zo slecht zijn.

[edit]

Ik heb ooit eens wat toString dingen in elkaar gezet. Je kan dan een JCombobox, JList en nog een paar componenten gewoon een toString functie als strategy aan meegeven. Dan hoef je dus niet meer te pielen met het zelf te doen, maar alleen nog zeggen:

code:
1
2
3
4
5
6
class PersoonToString implements ToString<Persoon>{

      String toString(Persoon p){
            return p.getVoornaam()+"-"+p.getAchternaam();
      }
}

[ Voor 21% gewijzigd door Alarmnummer op 16-02-2004 16:37 ]

Pagina: 1