[java]ArrayList ook te gebruiken in JTable?

Pagina: 1
Acties:

  • Patrickvs
  • Registratie: Juli 2000
  • Laatst online: 16-05 07:44
Ik gebruik voor mijn programma een JTable en heb een aparte TableModel(AbstractTableModel ;) )gemaakt, maar hoe kan ik nu objecten uit een arraylist laten verschijnen in de JTable?

In de arraylist heb ik objecten van het type schaatser, met daarin verschillende variabelen die worden gereturned zoals naam, 500M tijd enz.

Ik heb het al geprobeerd om de arraylist in de JTable in te voeren maar omdat ik in de methode toString in de class Schaatser alleen maar de naam heb gereturned verschijnt alleen de naam dus in de JTable.

Heb ook al in de tutorial en api doc gekeken maar daar kan ik niet echt een oplossing vinden, weet ook niet of het mogelijk is daarom vraag ik het ff :)

Hoe kan ik er nu voor zorgen dat ook de verschillende tijden in de JTable verschijnt.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
-P@tRiCk-: Ik gebruik voor mijn programma een JTable en heb een aparte TableModel(AbstractTableModel ;) ) gemaakt
Hulde :) .
maar hoe kan ik nu objecten uit een arraylist laten verschijnen in de JTable?
Eigenlijk heel simpel: je waarschijnlijk hebt nu waarschijnlijk in het model een lijstje van schaatsers. Je moet nu de methode:
code:
1
Object getValueAt(int rowIndex, int columnIndex)

implementeren.

De implementatie is eigenlijk heel eenvoudig: de rowIndex verwijst meestal naar het i'de element in de lijst van schaatsers. De columnIndex verwijst naar een id in het column model (heb je waarschijnlijk nog niet gemaakt?). Aan de hand van deze id moet je een waarde van een schaatser opleveren. Dit kan bijvoorbeeld de naam, de tijd voor 500 m of wat dan ook zijn.
Hoe kan ik er nu voor zorgen dat ook de verschillende tijden in de JTable verschijnt.
Het beste kan je zelf een TableColumnModel aanmaken. Kijk daarvoor naar javax.swing.table.TableColumn en javax.swing.table.DefaultTableColumnModel. Je definieert in dit model de kolommen in je tabel. Dit doet je door voor elke kolom een TableColumn aan te maken en deze toe te voegen aan je column model. Bij elke kolom moet je ook een id opgeven en dat is precies de id die je in het TableModel gebruikt.

Probeer eerst maar eens wat, dan kan ik later specifieker tips geven. Ik kan ook wel een klein voorbeeld geven als je dat fijn vindt.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Patrickvs
  • Registratie: Juli 2000
  • Laatst online: 16-05 07:44
Zo ik heb nog even gekeken en ben er achter gekomen dat ik dan die ColumnModel aan mijn JTable moet hangen?

Ik heb dit gemaakt als SchaatserTableModel :
code:
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
import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import java.util.*;
import java.awt.*;


public class SchaatserTableModel extends AbstractTableModel {
      final String[] columnNames = {"Naam",
                          "500 M",
                          "1500 M",
                          "5000 M",
                          "10000 M"};
      ArrayList schaatsers;


    public SchaatserTableModel(ArrayList schaatsers)
    {
    this.schaatsers = schaatsers;
    }


    public int getColumnCount() {
      return columnNames.length;
    }

    public String getColumnName(int col) {
        return columnNames[col];
    }

    public int getRowCount() {
      return schaatsers.size();
    }

    public Object getValueAt(int row,int column) {
      //dit wil nog niet echt lukken
      return ???;
    }

}

Maar nu is mij niet duidelijk hoe ik die TableColumnModel en TableColumn moet combineren? Als je een klein voorbeeldje hebt zou dat heel mooi zijn.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Op deze manier kan het in het begin ook wel...

Je kan namelijk het TableModel en het TableColumnModel ook combineren. Dat is in feite wat je nu gedaan hebt. Vaak wil je dat niet, maar in dit geval is het voor een eerste opzet perfect.

Alles wat je hebt lijkt op het eerste gezicht goed. De methode getValueAt is eigenlijk heel simpel:
code:
1
2
3
4
5
final String[] columnNames = {"Naam",
                    "500 M",
                    "1500 M",
                    "5000 M",
                    "10000 M"};

De kolom naam is nu column 0.
De kolom 500 M is nu column 1.
etc...

In getValueAt vraag je eerst de schaatser op plaats 'row' op:
Schaatser schaatser = (Schaatser) schaatsers.get(row);
Daarna doe je een switch over de 5 kolommen. Voor geval Naam (0) return je schaatser.getName(). Voor de afstanden return je de tijd die nodig was voor de betreffende kolom.

Makkelijk he? :) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Patrickvs
  • Registratie: Juli 2000
  • Laatst online: 16-05 07:44
ik heb dit nu als oplossing maar ik weet niet of dit wel klopt en ik vraag me ook af of dit wel netjes is met het doorgeven van die arraylist ...
code:
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
import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import java.util.*;
import java.awt.*;


public class SchaatserTableModel extends AbstractTableModel {
      final String[] columnNames = {"Naam",
                          "500 M",
                          "1500 M",
                          "5000 M",
                          "10000 M"};

    SchaatserListModel model;

    public SchaatserTableModel(SchaatserListModel model)
    {
    this.model = model;
    }


    public int getColumnCount() {
      return columnNames.length;
    }

    public String getColumnName(int col) {
        return columnNames[col];
    }

    public int getRowCount() {
      return model.schaatsers.size();
    }

    public Object getValueAt(int row,int column) {
    Schaatser schaatser = (Schaatser) model.schaatsers.get(row);
    switch (column) {
        case 0 : return schaatser.getNaam(); break;
        case 1 : return schaatser.get500M(); break;
        case 2 : return schaatser.get1500M(); break;
        case 3 : return schaatser.get5000M(); break;
        case 4 : return schaatser.get10000M(); break;
    }
    }

}

Ik roep die arraylist nu aan vanuit de class SchaatserListModel, dat mag eigenlijk niet he?

Hij geeft bij de switch nu deze foutmelding :
"SchaatserTableModel.java": Error #: 354 : incompatible types; found: int, required: java.lang.Object at line 38, column 44
Dit geeft ie alleen bij de integers die worden gereturned en niet bij de naam (type : string).

Nog een vraagje :
Als je zoveel classes moet definieren doe je dat dan op een centraal punt en daarna de classes doorgeven via de constructors of is daar een ander handigheidje voor?

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
-P@tRiCk-: Ik roep die arraylist nu aan vanuit de class SchaatserListModel, dat mag eigenlijk niet he?
Nee, het geeft zelfs nogal wat problemen. Als het ListModel wordt uitgebreid wordt dit namelijk niet doorgegeven aan de table.

Je kan een aantal dingen doen:
1. Maak een gezamelijk model wat zowel list model is als table model.
2. Werk via het list model (niet via de array list) en meldt om alles up-to-date te houden een listener aan op het list-model. Deze forward events naar de JTable.
Hij geeft bij de switch nu deze foutmelding :
"SchaatserTableModel.java": Error #: 354 : incompatible types; found: int, required: java.lang.Object at line 38, column 44
Dit geeft ie alleen bij de integers die worden gereturned en niet bij de naam (type : string).
Je mag geen int opleveren. De methode getValueAt moet een Object opleveren. Zet het dus gewoon even om naar een String.
Als je zoveel classes moet definieren doe je dat dan op een centraal punt en daarna de classes doorgeven via de constructors of is daar een ander handigheidje voor?
Tja, meestal maak ik centraal alleen instanties aan die ook echt breed beschikbaar moeten zijn (zoals de modellen). Dingen niet niet globaal hoeven te zijn kan je beter later aanmaken, zodat je niet al te veel argumenten mee hoeft te geven aan de constructoren.

Een een centrale plaats moet je dus dingen aanmaken die op verschillende plekken nodig zijn :) . Modellen zijn daarvan een goed voorbeeld.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment

Pagina: 1