[Java]Objecten in JList

Pagina: 1
Acties:

  • maurad3r
  • Registratie: Oktober 2004
  • Laatst online: 21-02 12:50
Ik werk op het moment met een JList die gebruik maakt van een DefaultListModel om objecten in op te sla, so far so good. De objecten in de JList worden allemaal gepresenteerd door een String, bv: 'beveiliging.Branche@b8'. Mijn vraag: is het mogelijk deze naam te veranderen, en zo ja: hoe!

Alvast bedankt.

  • Gonadan
  • Registratie: Februari 2004
  • Nu online

Gonadan

Admin Beeld & Geluid, Harde Waren
Wat bedoel je precies met "ze worden gepresenteerd door een string"?

gebruikt je een toString methode? Want die moet je vaak zelf schrijven voor objecten. :)

edit: wat code zou ook handig zijn ;)

[ Voor 19% gewijzigd door Gonadan op 23-03-2006 11:05 ]

Look for the signal in your life, not the noise.

Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


  • maurad3r
  • Registratie: Oktober 2004
  • Laatst online: 21-02 12:50
Ik heb al geprobeerd een ToString() functie te maken: dat maakte geen enkel verschil.
Een stukje voorbeeldcode van wat ik nu ongeveeer heb.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Product
{
    public int m_id;
    public String m_naam;

    // Constructor
    // Getters en Setters
}

public class TestApplet extends JApplet
{
    public DefaultListModel m_lmLijst;
    public JList m_lbLijst;

    public void init ( )
    {
        m_lmLijst = new DefaultListModel ( );
        m_lbLijst = new JList(m_lmLijst);

        m_lmLijst.addElement( new Product ( 10, "Testnaam" ) );
    }
}

  • maurad3r
  • Registratie: Oktober 2004
  • Laatst online: 21-02 12:50
Stomme ik dat ik ben: ToString moest dus toString zijn B).
Ik ben zo gewend methodes met een hoofdletter te doen dat ik altijd vergeet dat de standaard Java klassen dat niet doen (waarom niet eigenlijk?).

Erg bedankt Gonadan!!

  • bvp
  • Registratie: Maart 2005
  • Laatst online: 23-02 12:02

bvp

Maurad3r schreef op donderdag 23 maart 2006 @ 11:14:
Ik heb al geprobeerd een ToString() functie te maken: dat maakte geen enkel verschil.
Een stukje voorbeeldcode van wat ik nu ongeveeer heb.

[/code]
Geef es de toString() method die je gemaakt hebt?
Maurad3r schreef op donderdag 23 maart 2006 @ 11:17:
Stomme ik dat ik ben: ToString moest dus toString zijn B).
Ik ben zo gewend methodes met een hoofdletter te doen dat ik altijd vergeet dat de standaard Java klassen dat niet doen (waarom niet eigenlijk?).

Erg bedankt Gonadan!!
Wen jezelf dan maar heel snel aan om methodes met een kleine letter te gaan schrijven!
Het is gewoon de conventie in Java om:
variablen: beginnen met kleine letter (volgend woord hoofdletter) ikBenLief
methoden: hetzelfde -> public void ikBenLief();
classes: hoofdletter beginnen, volgend woord ook hoofdletter -> public class IkBenLiever

kamelenStijl :P

Dit is gewoon zo afgeproken zodat je objecten, variablen etc. niet door elkaar haalt

[ Voor 57% gewijzigd door bvp op 23-03-2006 11:21 ]


  • CyBoB
  • Registratie: Januari 2001
  • Laatst online: 24-12-2025

CyBoB

.::BURB::.

JList pakt standaard de toString van je object om de items weer te geven. de "beveiliging.Branche@b8" tekst die je te zien krijgt is de default toString van Object en in dit geval het Branche object. Wat je dus zult doen is een toString functie moeten maken die de correcte tekst representatie terug geeft. iets als:

code:
1
2
3
4
5
6
7
8
9
10
public class Product
{
    public int m_id;
    public String m_naam;

    public String toString()
    {
        return this.m_naam;
    }
}


Als je dan een Product instantie aan je JList toevoegd dan zal er netjes de opgegeven naam getoond worden.


//edit
Moet sneller leren typen :(

[ Voor 7% gewijzigd door CyBoB op 23-03-2006 11:24 ]


  • bvp
  • Registratie: Maart 2005
  • Laatst online: 23-02 12:02

bvp

CyBoB schreef op donderdag 23 maart 2006 @ 11:23:
JList pakt standaard de toString van je object om de items weer te geven. de "beveiliging.Branche@b8" tekst die je te zien krijgt is de default toString van Object en in dit geval het Branche object. Wat je dus zult doen is een toString functie moeten maken die de correcte tekst representatie terug geeft. iets als:

code:
1
2
3
4
5
6
7
8
9
10
public class Product
{
    public int m_id;
    public String m_naam;

    public String toString()
    {
        return this.m_naam;
    }
}


Als je dan een Product instantie aan je JList toevoegd dan zal er netjes de opgegeven naam getoond worden.


//edit
Moet sneller leren typen :(
Tja kan zo.
Kunt ook gewoon in de class Product een methode getName() definieren en die aan de JList toevoegen. String is immers ook een Object ;)

Dan houd je je toString() method voor het uitprinten van het gehele object Product -> dus bijv id EN name.

  • Gonadan
  • Registratie: Februari 2004
  • Nu online

Gonadan

Admin Beeld & Geluid, Harde Waren
Volgens mij heeft hij het al werkend, of ik moet het verkeerd begrepen hebben. ;)

Look for the signal in your life, not the noise.

Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


  • maurad3r
  • Registratie: Oktober 2004
  • Laatst online: 21-02 12:50
Gonadan schreef op donderdag 23 maart 2006 @ 11:28:
Volgens mij heeft hij het al werkend, of ik moet het verkeerd begrepen hebben. ;)
Hehe.. helemaal correct!
Allemaal toch bedankt, ik ga mezelf maar eens aanleren methodes met kleine letters te beginnen.

  • Gonadan
  • Registratie: Februari 2004
  • Nu online

Gonadan

Admin Beeld & Geluid, Harde Waren
Maar uiteindelijk probeerde je dus met een ToString() methode de toString() methode van de superclass te overrulen? :)

Dan maar de conventie volgen inderdaad ;)

Look for the signal in your life, not the noise.

Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

Leer jezelf dan ook meteen aan dat in Java de Hungarian notatie niet gebruikt wordt. Zie link:

http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html, hoofdstuk 9: naming conventions.

Dat is de standaard en die wordt door vrijwel iedereen nageleefd.

Het enige puntje waar twijfel over is, zijn openingsaccolades. Die horen op dezelfde regel te staan, maar worden er ook vaak onder geplaatst. Kwestie van smaak.

Fat Pizza's pizza, they are big and they are cheezy


  • Gonadan
  • Registratie: Februari 2004
  • Nu online

Gonadan

Admin Beeld & Geluid, Harde Waren
JKVA schreef op donderdag 23 maart 2006 @ 11:47:
Leer jezelf dan ook meteen aan dat in Java de Hungarian notatie niet gebruikt wordt. Zie link:

http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html, hoofdstuk 9: naming conventions.

Dat is de standaard en die wordt door vrijwel iedereen nageleefd.

Het enige puntje waar twijfel over is, zijn openingsaccolades. Die horen op dezelfde regel te staan, maar worden er ook vaak onder geplaatst. Kwestie van smaak.
Ik vind dat ze bij JAVA er achter horen, ik vind het ook makkelijker leesbaar, je ziet wat er bij het block hoort. Maar da's maar een mening ;)

Look for the signal in your life, not the noise.

Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


  • bvp
  • Registratie: Maart 2005
  • Laatst online: 23-02 12:02

bvp

Gonadan schreef op donderdag 23 maart 2006 @ 11:49:
[...]

Ik vind dat ze bij JAVA er achter horen, ik vind het ook makkelijker leesbaar, je ziet wat er bij het block hoort. Maar da's maar een mening ;)
offtopic:
HELEMAAL mee eens! ;)

  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

Ik vind ook dat erachter netter is, maar je ziet toch nog vaak dat ze eronder staan omdat dan de scope duidelijker is. Maar goed, het maar weer een mening. Zolang Eclipse mijn opmaak verzorgt, vind ik het allemaal best. Typen, typen, typen, ctrl + shift + f en klaar is Kees. :P

Fat Pizza's pizza, they are big and they are cheezy


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 18:30

Robtimus

me Robtimus no like you

bvp schreef op donderdag 23 maart 2006 @ 11:27:
Tja kan zo.
Kunt ook gewoon in de class Product een methode getName() definieren en die aan de JList toevoegen. String is immers ook een Object ;)

Dan houd je je toString() method voor het uitprinten van het gehele object Product -> dus bijv id EN name.
Nadeel daarvan is dat je, om bv een referentie naar het geselecteerde product te krijgen, weer moeilijk moet gaan doen met maps oid. Het fijne van JList, JTrees, JTables etc is dat omdat er juist Objects in gaan je alles op 1 plek opgeslagen houdt.
Dus niet zoals in bv VB eerst de naam uit je list halen en dan ergens anders het product voor die naam opzoeken, nee je haalt meteen je product uit de list.

Dat je daardoor minder informatie in je toString kan stoppen is jammer maar helaas. Als ik die info nodig heb voor debuggen dan schrijf ik wel een eigen method die dat doet. Ik kan niet de models voor JList etc aanpassen*, dus dan maar de debugging info.


* Natuurlijk kun je je eigen model gaan schrijven, maar om dat alleen te doen om je objecten anders af te beelden vind ik teveel moeite.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 13:08

Janoz

Moderator Devschuur®

!litemod

JKVA schreef op donderdag 23 maart 2006 @ 11:47:
Leer jezelf dan ook meteen aan dat in Java de Hungarian notatie niet gebruikt wordt. Zie link:

http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html, hoofdstuk 9: naming conventions.

Dat is de standaard en die wordt door vrijwel iedereen nageleefd.

Het enige puntje waar twijfel over is, zijn openingsaccolades. Die horen op dezelfde regel te staan, maar worden er ook vaak onder geplaatst. Kwestie van smaak.
Het verschil in plaatsing van een accolade is marginaal in vergelijking met de case eisen. Als jij een stuk code schrijft dat anderen moeten gebruiken (dus aanroepen, en niet aanpassen) dan merk je niks meer van de plek van een accolade, maar destemeer van de gebruikte case. Het vastleggen van een globale taal specifieke eis voor de plaatsing van een accolade vind ik zelf dan ook een beetje onzin (tenzij uiteraard binnen een project, projectgroep, afdeling of bedrijf)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

Janoz schreef op donderdag 23 maart 2006 @ 13:00:
[...]


Het verschil in plaatsing van een accolade is marginaal in vergelijking met de case eisen. Als jij een stuk code schrijft dat anderen moeten gebruiken (dus aanroepen, en niet aanpassen) dan merk je niks meer van de plek van een accolade, maar destemeer van de gebruikte case. Het vastleggen van een globale taal specifieke eis voor de plaatsing van een accolade vind ik zelf dan ook een beetje onzin (tenzij uiteraard binnen een project, projectgroep, afdeling of bedrijf)
?

Ik begrijp niet helemaal wat je bedoelt. Ik ben het er wel mee eens dat zulke code te lezen is, maar aan de andere kant zijn conventies er om nageleefd te worden. Dit wordt in de Javawereld vrij goed gedaan en daar ben ik wel blij om, als ik het vergelijk met bijvoorbeeld PHP. (dit is geen flame)

Het is een kwestie van smaak wat je het meest netjes vindt ogen, maar je moet niet per persoon een eigen stijl gaan naleven.

Maar goed, het dwaalt af...

Fat Pizza's pizza, they are big and they are cheezy


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 13:08

Janoz

Moderator Devschuur®

!litemod

Wat ik meer bedoel is dat een conventie over case een stuk meer impact heeft dan een conventie over op welke plek je de accolade zet (nieuwe regel, zelfde regel). Het eerste zorgt ervoor dat een api of andere library fundamenteel anders wordt terwijl het laatste verschil alleen van invloed is wanneer je daadwerkelijk met de code aan het werk moet. Natuurlijk moet er over het laatste ook afspraken gemaakt worden, maar de scope van die afspraken hoeven wat mij betreft niet verder te gaan dan een project, afdeling of onderneming. Het lijkt mij bijvoorbeeld niet wenselijk dat sun verplicht dat iedereen in zijn javacode de accolade op een nieuwe regel zet en dat hij zijn tabafstand op 2 spaties zet.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 23-02 19:42
wat een off topioc geneuzel. Ik zet altijd de accolades op een nieuwe regel. Veel duidelijker vind ik zelf.

Maar even on topic. Je kan ook middels een ListCellRenderer de juiste contents rendereren als je niet de toString method wilt gebruiken:
Java:
1
2
3
4
5
6
7
8
9
10
11
new JList().setCellRenderer(new ListCellRenderer()
        {
        
            public Component getListCellRendererComponent(JList list, Object value, int index,
                    boolean isSelected, boolean cellHasFocus)
            {
                Product p = (Product)value;
                return p.getName();
            }
        
        });

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 18:30

Robtimus

me Robtimus no like you

PhoneTech schreef op donderdag 23 maart 2006 @ 14:53:
Maar even on topic. Je kan ook middels een ListCellRenderer de juiste contents rendereren als je niet de toString method wilt gebruiken:
Java:
1
2
3
4
5
6
7
8
9
10
11
new JList().setCellRenderer(new ListCellRenderer()
        {
        
            public Component getListCellRendererComponent(JList list, Object value, int index,
                    boolean isSelected, boolean cellHasFocus)
            {
                Product p = (Product)value;
                return p.getName();
            }
        
        });
Dat kan ook, maar ik zou het toch wel zeker anders implementeren:
subclass van DefaultCellRenderer (of hoe dat ding ook heet), het Component via de super opvragen, en (aangezien dat een JLabel is) via setText de text veranderen.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 23-02 19:42
IceManX schreef op donderdag 23 maart 2006 @ 18:01:
[...]
Dat kan ook, maar ik zou het toch wel zeker anders implementeren:
subclass van DefaultCellRenderer (of hoe dat ding ook heet), het Component via de super opvragen, en (aangezien dat een JLabel is) via setText de text veranderen.
Hier heb je ook helemaal gelijk in. het voorbeeldje was ook niets meer dan een proof of concept.
Veel beter is om van de DefaultListCellRenderer te extenden. Dan zet hij ook meteen de kleuren goed als de cell geselecteerd is.
Pagina: 1