Toon posts:

[Java] TableModel

Pagina: 1
Acties:

Verwijderd

Topicstarter
Voor een programma heb ik een tabel nodig met artikelen. In deze tabel moeten nieuwe artikelen kunnen worden toegevoegd. Ik heb reeds een class Artikel gemaakt die verschillende eigenschappen van een artikel bijhoud. Nu wil ik echter de artikelen in een tabel weergeven, maar dan alleen nummer, naam en prijs van het desbetreffende artikel en niet de andere eigenschappen zoals bijv. btw-categorie.

Ik heb inmiddels het volgende TableModel maar wat moet ik toevoegen om het gewenste effect te krijgen?
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
public class ArtikelenTableModel extends AbstractTableModel {
  final String[] columnNames = {"Nummer","Naam","Prijs"};
  final Vector data = new Vector();

  public ArtikelenTableModel() {
  }

  public void addArtikel(Artikel a) {
    data.addElement(a);
  }

  public void insertArtikel(Artikel a, int i) {
    data.insertElementAt(a, i);
  }
  
  public int getColumnCount() {
    return columnNames.length;
  }

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

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

  public Object getValueAt(int row, int col) {
    return data.elementAt(row);
  }

  public Class getColumnClass(int c) {
    return getValueAt(0, c).getClass();
  }

  public void setValueAt(Object value, int row, int col) {
      data.setElementAt(value, row);
      fireTableCellUpdated(row, col);
  }
}

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

Alarmnummer

-= Tja =-

volgens mij zou dit moeten werken, maar wat werkt er niet?

ps: als je items toevoegt aan je tablemodel dan wordt er geen update naar de view gestuurd.. en verder is het zo onbeveiligd als het maar kan. Je kan er zelfs null waardes ed instoppen en je hebt totaal geen controle op het instellen van de waarde met setvalue. Dit ding kan je niet gebruiken voor serieuze toepassingen.

Verwijderd

Topicstarter
Ben er inmiddels al uit en heb alles ook al verbetert. :)
't Zag er inderdaad nog niet netjes uit, maar daar ging het ook niet om. setValue heb ik weggehaald en getValue moest nog worden aangepast... |:(

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

Alarmnummer

-= Tja =-

Ik zie ook inderdaad dat je getValue alleen een bepaalde Artikel ophaalt en niet de afzonderlijke gegevens van dat artikel.

ik doe meestal zoiets:
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
class ArtikelTableModel extends AbstractTableModel{

   static final private int NUMMER = 0;
   static final private int NAAM = 1;
   static final private int PRIJS = 2;

   ......

   public void getValueAt(int row, int col){
     checkRowColumn(row,column);//zelf ff bedenken
   
     Artikel artikel = (Artikel)data.get(row);
     Object result = null;
     switch(col){
         case NUMMER: 
          result = new Integer(artikel.getNummer());
          break;
         case NAAM: 
          result = artikel.getNaam();
          break;
         case PRIJS:
          result = new Float(artikel.getPrijs());
          break;
         default:
          Assert.fail("unknown col"+col);
     }
     return result;
   }
}

Maar verder wordt je tablemodel ook niet geupdate als je er een artikel aan toevoegt. Ik zou het volgende doen:

maak een nieuwe class ArtikelList. Hierin komen alle artikelen te staan. Deze artikel list kan ook event versturen als er een artikel bijkomt, afgaat. Je laat dan de tablemodel luisteren naar de ArtikelList en zodoende blijft je tablemodel (dus je table) altijd up to date met je ArtikelList. Ik weet niet of je een beetje thuis bent in events, maar anders kan je dit ook gebruiken:
Topic over CollectionSupport (zelfde idee als PropertyChangeSupport)

Verwijderd

Topicstarter
Ik heb nu het volgende:
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import javax.swing.table.AbstractTableModel;

import java.awt.*;
import java.awt.event.*;
import java.util.Vector;
import java.util.Enumeration;

public class ArtikelenTableModel extends AbstractTableModel {
  final String[] columnNames = {"Nummer","Naam","Prijs"};   
  final Vector data = new Vector();              
  final int NUMMER = 0;
  final int NAAM = 1;
  final int PRIJS = 2;

  public ArtikelenTableModel() {
  }

  public void addArtikel(Artikel a) {
    if (a != null) {
    int row = 0;
    int thisNr = a.getNummer();
    for (Enumeration e = data.elements() ; e.hasMoreElements() ;) {
      int artNr = ((Artikel)e.nextElement()).getNummer();
      if (thisNr == artNr) {
        // Artikelnummer bestaat al, niet toevoegen.
        System.out.println("Artikel bestaat al");
        return;
      }
      else if (thisNr < artNr) {
        data.insertElementAt(a, row);
        fireTableDataChanged();
        return;
      }
      else {
        row++;
      }
    }
    // Artikel bestaat nog niet en moet achteraan worden ingevoegd.
    data.addElement(a);
    fireTableDataChanged();
    }
  }

  public boolean checkRow(int row) {
    return (row >= 0 && row < getRowCount());
  }

  public boolean checkCol(int col) {
    return (col >= 0 && col < getColumnCount());
  }

  public void removeArtikel(int row) {
    if (checkRow(row)) {
    data.removeElementAt(row);
    fireTableDataChanged();
    }
  }

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

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

  public String getColumnName(int col) {
    if (checkCol(col)) {
    return columnNames[col];
    }
    else {
    return "";
    }
  }

  public Object getValueAt(int row, int col) {
    Object retVal = null;
    if (checkRow(row) && checkCol(col)) {
    if (col == NUMMER) {
      retVal = String.valueOf(((Artikel)data.elementAt(row)).getNummer());
    }
    else if (col == NAAM) {
      retVal = ((Artikel)data.elementAt(row)).getNaam();
    }
    else if (col == PRIJS) {
      retVal = String.valueOf(((Artikel)data.elementAt(row)).getPrijs());
    }
    }
    return retVal;
  }

  public Artikel getArtikel(int row) {
    if (checkRow(row)) {
    return ((Artikel) data.elementAt(row));
    }
    else {
    return null;
    }
  }

  public Vector getArtikelen() {
    return data;
  }
}

Werkt prima. :)

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

Alarmnummer

-= Tja =-

Jij hebt nu de logica van die Artikel list verweven in een TableModel. Als jij bv een andere visualisatie wilt gebruiken dan een JTable kom je weer in de problemen. Je kan het beste een ArtikelList maken waarin alle logica voor de artikellist komt (trust me). Daarnaast zie ik dat je 'vriendelijke' functies maakt:

code:
1
2
3
4
5
6
7
8
9
public String getColumnName(int col) {
    if (checkCol(col)) {
    return columnNames[col];
    }
    else {
    return "";
    }
  }
  ....

Je moet er gewoon uitknallen met een RuntimeException omdat er sprake is geweest van een programeer fout.
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
  public void addArtikel(Artikel a) {
    if (a != null) {
    int row = 0;
    int thisNr = a.getNummer();
    for (Enumeration e = data.elements() ; e.hasMoreElements() ;) {
      int artNr = ((Artikel)e.nextElement()).getNummer();
      if (thisNr == artNr) {
        // Artikelnummer bestaat al, niet toevoegen.
        System.out.println("Artikel bestaat al");
        return;
      }
      else if (thisNr < artNr) {
        data.insertElementAt(a, row);
        fireTableDataChanged();
        return;
      }
      else {
        row++;
      }
    }
    // Artikel bestaat nog niet en moet achteraan worden ingevoegd.
    data.addElement(a);
    fireTableDataChanged();
    }
  }

Je laat hier ook toe dat je een null waarde voor arikel toevoegt en je vind het niet erg als een item voor een 2e keer wordt toegevoegd aan de lijst. Je voegt hem inderdaad niet toe aan de lijst, maar er is weer sprake geweest van een prog fout die je had moeten melden met een RuntimeException. Vriendelijke functies maken is bad omdat een andere programmeur niet in de gaten heeft dat hij iets heeft foutgedaan.

Verwijderd

Topicstarter
Je hebt helemaal gelijk. 't Is inderdaad wat vriendelijk.
Is my nature I guess... ;) 'k Zal het aanpassen. Moet dat met die events maar eens gaan leren... Thanx
Pagina: 1