Avatar billede dennism Nybegynder
19. december 2006 - 14:03 Der er 6 kommentarer og
1 løsning

Java: JTabel

Jeg har en JTable som bliver lavet med en DefaultTableModel, hvor data'ene bliver lavet på denne måde:

    data = new Object[numRows][3];

        for(int n=0; sql.next(); n++) {
        Competitor competitor = new Competitor(sql.getInt("num"), sql.getInt("id"), sql.getString("title"), sql.getInt("active"),0);
            data[n][0] = competitor.getNum();
            data[n][1] = competitor.getTitle();
            data[n][2] = competitor.getStatus();
        }

Min competitor-klasse har en metode der hedder "getId". Jeg er interesseret i at jeg senere i mit program, kan få ID'et på den række i min JTable som er markeret.
Havde jeg haft en kolonne i min tabel som indeholdte ID'et, kunne det f.eks. lade sig gøre på denne måde (hvis ID'et var i 3. kolonne):
int competitorId = (Integer)data[table.getSelectedRow()][2];

Men nu da jeg har fjernet ID'et fra tabellen, ved jeg ikke længere hvordan jeg skal få det ud. Nogen der kan hjælpe med det?
Avatar billede aslan Nybegynder
19. december 2006 - 14:31 #1
Her er en måde at gøre det på:

Override toString() i din competitor klasse. Lad toString() returnere getNum(). Istedet for at smide data ind smid obj. ind i kolonne 1.

data[n][0] = competitor

Når en række bliver valgt tag kolonne 1 og parse den til objektet competitor og kald getId().

Håber det gav mening :-)
Avatar billede dennism Nybegynder
19. december 2006 - 14:34 #2
Well, havde også selv udtænkt den metode - men troede bare der var en nemmere måde at gøre det på ;)
Avatar billede aslan Nybegynder
19. december 2006 - 15:10 #3
Ja selvfølgelig. Der er 2 andre måder at gøre det på, men det behøver jeg jo ikke at fortælle dig, for det har du nok allerede tænkt på.
Avatar billede schwarz84 Nybegynder
19. december 2006 - 16:20 #4
Den "pæne" måde at gøre det på er ikke at overskrive toString() men derimod at sætte en renderer på JTable der kan håndtere dit objekt på den korrekte måde. Det kan enten gøres ved implementere dette interface: http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/table/TableCellRenderer.html eller override getTableCellRendererComponent i denne klasse: http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/table/DefaultTableCellRenderer.html og sætte renderen på din TableColumn.
At oveskrive denne metode give dig det nødvendige hook til at vise hvad du vil i stedet for objektets toString() metode. Det er den måde der er meningen fra Swing-folkenes side at man skal gøre det...
Avatar billede aslan Nybegynder
19. december 2006 - 18:54 #5
schwarz84, jeg tror du misforstår hvad toString() bruges til i dette eks. Problemet er at der fra hver række i en tabel skal være en reference til f.eks en tabel/række i en database. Dette gøres som regel via en id fra databasen.
Det har intet at gøre med hvordan data præsenteres i en tabel via renderer. En renderer kunne f.eks bruges til at formatere beløb eller dato om i præsentation af data uden at lave selveste data om i tabel modellen(DefaultTableModel).
Avatar billede dennism Nybegynder
20. december 2006 - 10:18 #6
aslan >>

Jeg vil meget gerne høre, hvad de to andre løsninger går ud på?
Avatar billede schwarz84 Nybegynder
20. december 2006 - 18:37 #7
aslan: Nej, jeg er helt med på det. I tilfælde af at man ikke laver en renderer til sit objekt er der en standard renderer der viser strengen fra toString()-metoden som du er inde på at man så kan overskrive. Jeg siger bare at den korrekte måde er at lave en renderer der kalder den rigtige metode. Denne toString() har intet med en generel streng-repræsentation at gøre, og det kan være noget bøvl at gøre sådan noget hvis man rent faktisk har brug for en rigtig toString().
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester