TableModel

Status
Nicht offen für weitere Antworten.

babel

Aktives Mitglied
So guten Morgen ich stehe hier vor einem Problem und zwar arbeite ich mit jdbc in dem Fall auch mit einer MS ACCESS Datenbank und ich will die daten an eine Tabelle übergeben, was auch funktioniert, die Frage ist nur wie ist es eigentlich wenn ich in der Tabelle was in den Zellen editiere? den ich würde gerne dann nach dem editieren einfach auf ein button klicken was die änderungen dann in der DB abspeichert und die Tabelle dann neu zeichnet. Hier erstmal ein versuch von mir ^^ ich habe eine Methode wo der Treiber geladen wird und der Pfad gelesen wird und dort übergeb ich die Daten an meine Tabelle aber was ich versuche ist an mein TableModel zu übergeben wie mach ich das am besten? hier ist ein teil des codes.

[highlight="Java"]
public void initDB()
{
...
ResultSetMetaData metaresult;

metaresult=rs.getMetaData();

int spalten = metaresult.getColumnCount();

int i = -1;

while(rs.next())
{
i++;
vectorid.insertElementAt(rs.getString(1), i);
vectorvorname.insertElementAt(rs.getString(2), i);
vectornachname.insertElementAt(rs.getString(3), i);
vectorstrasse.insertElementAt(rs.getString(4), i);
vectorwohnort.insertElementAt(rs.getString(5), i);
}


String datenzeile[][] = new String[vectorid.size()][spalten];

for(int j = 0; j < datenzeile.length; j++)
{
// rs.next();
datenzeile[j][0] = (String) vectorid.get(j);
datenzeile[j][1] = (String) vectorvorname.get(j);
datenzeile[j][2] = (String) vectornachname.get(j);
datenzeile[j][3] = (String) vectorstrasse.get(j);
datenzeile[j][4] = (String) vectorwohnort.get(j);
daten.add(datenzeile);
}





String[]columnnames = {"ID", "Vorname", "Nachname", "Straße", "Wohnort"};

tabelle.setModel(new MyTableModel());

vectorid.clear();
vectorvorname.clear();
vectornachname.clear();
vectorstrasse.clear();
vectorwohnort.clear();
...
}
[/highlight]
stimmt es so weit? ^^ weil sonst bin ich gerade beim TableModel und da hackt es etwas :(
 
Zuletzt bearbeitet:

Michael...

Top Contributor
Warum speicherts Du die Daten zunächst in Vectoren, um sie anschliessend in einem Array zu speichern? Richtig aufbereitet kannst Du dem TableModel auch einen Vector übergeben:

Java:
Vector data = new Vector();
Vector dataLine;
int i;
while(rs.next()) {
    dataLine = new Vector();
    for (i=1; i<=5;i++)
        dataLine.add(rs.getString(i);
    data.add(dataLine);
}
 

babel

Aktives Mitglied
gut hab ich umgeändert der tut mir zwar die daten 5x darstellen ich schau gerade wo der fehler ist aber jetzt die andere frage soll ich eigentlich mit dem result arbeiten oder mit den 2 vectoren? also daten und spalten
 
S

SlaterB

Gast
ResultSets und Statements so schnell wie möglich wieder schließen, belegen DB-Ressourcen
 

Landei

Top Contributor
1. Mach dir ein eigenes Datenobjekt, z.B. Adresse
Java:
public class Address {
    private String id;
    private String firstName;
    ...
    public String getId() { return id; }
    public void setId(String id) { this.id = id; }
    ... 
}

2. Nimm einen Liste statt einem Vector
Java:
  List<Address> addresses = new ArrayList<Addresses>();
...
           while(rs.next())
            {
                i++;
                Address address = new Address();
                address.setId(rs.getString(1), i);
                ... 
                addresses.add(address);
            }

3. Schreib dein eigenes TableModel
Java:
public AddressTableModel extends AbstractTableModel {
    private List<Address> addresses;
    public AddressTableModel(List<Address> addresses){ this.addresses = addresses; } 
    public int getColumnCount() { return 5; }
    public int getRowCount() { return addresses.size(); }
    public Object getValueAt(int col, int row) {
        Address address = addresses.get(row);
        switch(col) {
         case 0: return address.getId();
         case 1: return address.getFirstName();
         ...
         default: return "ilegal column index " + col;
        }  
    }
   ...
}
(aus'm Kopp - ohne Gewähr)

Glaub mir, das mag jetzt erst mal komplizierter wirken, du sparst dir damit später aber eine Menge Arbeit.
 
Zuletzt bearbeitet:

babel

Aktives Mitglied
ResultSets und Statements sind closed, ich bin jetzt an der Sache von Landei dran thx schonmal ^^
 

babel

Aktives Mitglied
nur noch kurze frage wie übergeb ich meine daten an das tablemodel?
ich habe erstmal so probiert aber es kommen dann böse exceptions ^^

[highlight="Java"]
AddressTableModel model = new AddressTableModel();
tabelle = new JTable(model);
[/highlight]

und zwar java.lang.NullPointerException also greif ich auf eine position zu die mit null gefüllt ist
 
Zuletzt bearbeitet:

Geeeee

Bekanntes Mitglied
Liste initialisieren.
Java:
List<Address> adresses = new ArrayList<Address>();
Alles andere ist leider ohne deine AddressTableModel - Klasse schlecht vorherzusagen
 

Landei

Top Contributor
Ich hatte vorausgesetzt, dass das Model im Konstruktort initialisiert wird:
Java:
public AddressTableModel(List<Address> addresses){ this.addresses = addresses; }
 

babel

Aktives Mitglied
so habs dann ^^ nur mein Problem ist ja ich kann jetzt änderungen durchführen in der Datenbank nur wie kann ich jedesmal wenn ich auf ein Button klicke die Tabelle neuzeichnen? sonst müsst ich ja jedesmal die anwendung neustarten. Hab vorhin mit DefaultTableModel gearbeitet und es sah folgend bei mir aus

[highlight="Java"]

tabelle.setModel(new javax.swing.table.DefaultTableModel(datenzeile,columnnames));

[/highlight]

und die Tabelle wurde immer neu aktualisiert aber wie kann ich jetzt mit meinem TableModel das durchführen? ^^ mfg babel
 

Landei

Top Contributor
Das TableModel benachrichtigt "seine" Tabelle automatisch, wenn sich etwas geändert hat. Dazu musst du nur eine der fire... Methoden am Model aufrufen (natürlich die Variante, die gerade Sinn ergibt). Ansonsten: Code zeigen!
 

babel

Aktives Mitglied
so sieht mein TableModel aus

[highlight="Java"]
public class AddressTableModel extends AbstractTableModel
{
private ArrayList<Address> addresses;

public AddressTableModel(ArrayList<Address> addresses)
{
this.addresses = addresses;
}
public int getColumnCount()
{
return 5;
}
public int getRowCount()
{
return addresses.size();
// return 51;
}
public Object getValueAt(int col, int row)
{
Address address = addresses.get(col);

switch(row)
{
case 0: return address.getId();
case 1: return address.getVorname();
case 2: return address.getNachname();
case 3: return address.getStrasse();
case 4: return address.getWohnort();

default: return "ilegal column index " + col;
}
}

public boolean isCellEditable(int row, int col)
{
return true;
}

public void setValueAt(Object eintrag, int row, int col)
{
Address address = addresses.get(col);

switch(row){

case 0 : eintrag = ((List) address).get(row);
case 1 : eintrag = ((List) address).get(row);
case 2 : eintrag = ((List) address).get(row);
case 3 : eintrag = ((List) address).get(row);
case 4 : eintrag = ((List) address).get(row);
}
fireTableDataChanged();
}
public void tableUpdate(ArrayList<Address> addresses)
{
System.out.println("Update durchgeführt");
this.fireTableDataChanged();
}

public String getColumnName(int spalte)
{
if (spalte == 0)
{
return "ID";
}
else if(spalte == 1)
{
return "Vorname";
}
else if(spalte == 2)
{
return "Nachname";
}
else if(spalte == 3)
{
return "Strasse";
}
else
{
return "Wohnort";
}
}
}
[/highlight]
 

babel

Aktives Mitglied
also wenn ich sqlbefehle manuell eingebe dann funktioniert es aber wie ist es wenn ich in der Tabelle editiere? weil wenn ich aus einer zelle raus switche dann wird der wert auf standart gesetzt also auf den anfangswert
 

Michael...

Top Contributor
[highlight="Java"]public void setValueAt(Object eintrag, int row, int col)
{
Address address = addresses.get(col);

switch(row){

case 0 : eintrag = ((List) address).get(row);
case 1 : eintrag = ((List) address).get(row);
case 2 : eintrag = ((List) address).get(row);
case 3 : eintrag = ((List) address).get(row);
case 4 : eintrag = ((List) address).get(row);
}
fireTableDataChanged();
}
[/highlight]
Du hast setValue(...) falsch überschrieben. Du musst die Werte in der Liste adresses ändern und nicht das Objekt eintrag.
eintrag wird vom Editor an das Model übergeben und Du musst dieses Objekt der richtigen Variable des Adress- Objektes übergeben z.B:
Java:
case 0 : address.setID(eintrag);
 

babel

Aktives Mitglied
was ich noch übersehn hab die setter erwarten einen string und einen int variable aber wie ist es wenn ich ja 2 hab? also col und rows

[highlight="Java"]

public String getId()
{
return id;
}
public void setId(String id, int i)
{
this.id = id;
}
...

public void setValueAt(String eintrag, int row, int col)
{
Address address = addresses.get(col);

switch(row){

case 0 : address.setId(eintrag);
case 1 : address.setVorname(eintrag);
case 2 : address.setNachname(eintrag);
case 3 : address.setStrasse(eintrag);
case 4 : address.setWohnort(eintrag);

...
}
[/highlight]

bei mir ist ja das problem das ich die änderungen in einer datenbank noch speichern muss! :/
 
Zuletzt bearbeitet:

Landei

Top Contributor
Java:
..
          Address address = addresses.get(row);
          switch(col){
...

Füge dem TableModel noch eine Methode hinzu, mit dem du die Adressen zurückbekommen kannst:
Java:
public List<Address> getAdresses() { return addresses; }

Für das Änderungs-Problem fällt mir nur ein, jeder Adresse ein modified-flag mitzugeben, das du setzt, solbald du etwas änderst:

Java:
public class Address {
    private String id;
    private String firstName;
    private boolean modified = false;
    ...
    public String getId() { return id; }
    public void setId(String id) { modified=true; this.id = id; } //!!!
    ... 
    public boolean isModified() { return modified; }
}

Dann kannst du am Ende deine Liste durchgehen und nur die geänderten Adressen updaten.

Oder du nimmst gleich ein Persistenz-Framework (JPA, Hibernate, EBean...)
 

Michael...

Top Contributor
was ich noch übersehn hab die setter erwarten einen string
Objekt.toString()
Java:
address.setId(eintrag.toString());
und einen int variable
Ich kenne Deine Klasse Adress bzw. deren Setter nicht. Eigentlich müsstest Du doch wissen was für einen int Du brauchst.
bei mir ist ja das problem das ich die änderungen in einer datenbank noch speichern muss! :/
Wie schaut den Dein Konzept aus soll jede Änderung sofort gespeichert werden, oder auf Knopfdruck einmalig, ...???
Allgemein wäre ein bisschen überschauberer Code sinnvoll, damit man sieht was Du schon hast und wie Du vorgehst.
 

babel

Aktives Mitglied
im grunde will ich die zellen editieren und wenn ich auf den knopf aktualisieren gehe, dann sollen die änderungen in die db gespeichert werden und wegen der übersicht des codes was braucht ihr? ^^ ist halt bissle gross :/
 

Michael...

Top Contributor
Übernimm doch die Idee von Landei mit dem modified Flag
Beim Speichern die Liste durchlaufen und schauen wo modfied gesetzt ist und entsprechen ein Update Statement an die Datenbank.

Sind die anderen Probleme schon behoben? Wenn nein, dann zeig doch mal die komplette Klasse Adress
 

babel

Aktives Mitglied
ich bin etwas weiter und zwar versuch ich die änderungen als strings zu speichern und die wiederum an meine sqlbefehle weiter leiten hier ist die address classe

[highlight="Java"]
public class Address {

private String id;
private String vorname;
private String nachname;
private String strasse;
private String wohnort;
private String lastid;

private boolean modified = false;

public String getId()
{
return id;
}
public void setId(String id)
{
idstring = id;
modified = true;
this.id = id;
}

public String getVorname()
{
return vorname;
}
public void setVorname(String vorname)
{
vornamestring = vorname;
modified = true;
this.vorname = vorname;
}
public String getNachname()
{
return nachname;
}
public void setNachname(String nachname)
{
nachnamestring = nachname;
modified = true;
this.nachname = nachname;
}
public String getStrasse()
{
return strasse;
}
public void setStrasse(String strasse)
{
strassestring = strasse;
modified = true;
this.strasse = strasse;
}
public String getWohnort()
{
return wohnort;
}
public void setWohnort(String wohnort)
{
wohnortstring = wohnort;
modified = true;
this.wohnort = wohnort;
}

public boolean isModified()
{
return modified;
}
}
[/highlight]
 

Landei

Top Contributor
Was willst du mit den ganzen idstring, vornamestring usw.?
Angenommen, die id wäre unveränderlich (was ja eine Kundennummer sein sollte).
Dann machst du einfach sowas zum Wegspeichern aller Adressen:

Java:
for(Address address:addresses) {
   if (address.isModified) {
        String sqlString = String.format("UPDATE adresse SET vorname='%s', nachname='%s', strasse='%s' ... " +     
            "WHERE id='%s'", address.getFirstName(), address.getLastName(), address.getStreet(), ... address.getId());
        //SQL abschicken ...
   }
}
 

babel

Aktives Mitglied
ja mein problem ist ja ich muss irgendwie die updates durchführen und mit den ganzen strings hab ich mir halt gedacht das die beim editieren mit verändert werden und das ich einfach merke in welcher zeile das passiert und dann führ ich die veränderungen durch
 

babel

Aktives Mitglied
kann mir jemand sagen was hier der syntax nicht entspricht? ^^

[highlight="Java"]
sqlbefehl = String.format("UPDATE Customer VALUES SET Vorname='%s', Nachname='%s', Strasse='%s', Wohnort='%s'" +
"WHERE ID='%s'", address.getVorname(), address.getNachname(), address.getStrasse(), address.getWohnort(), address.getId());

[/highlight]
 

babel

Aktives Mitglied
also? :D

[highlight="Java"]

sqlbefehl = String.format("UPDATE Customer SET Vorname='%s', Nachname='%s', Strasse='%s', Wohnort='%s' " +
" WHERE ID='%s'", address.getVorname(), address.getNachname(), address.getStrasse(), address.getWohnort(), address.getId());

[/highlight]

bekomme als fehlermeldung: java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] Datentypen in Kriterienausdruck unverträglich.
heißt das ich 2 verschiedene paarschuhe miteinander vergleiche? oder was mach ich da falsch?

okay passt es funzt alles ausser das er mir immer nur die letzte spalte editiert also mit der letzten id, jetzt muss ich nur noch dem sagen die ausgewählte id
der fehler lag erstmal in den einfachen einführungsstrichen bei der id da es in der datenbank als integer wert gespeichert ist und nicht als text

[highlight="Java"]

sqlbefehl = String.format("UPDATE Customer SET Vorname='%s', Nachname='%s', Strasse='%s', Wohnort='%s'" +
" WHERE ID= %s ", address.getVorname(), address.getNachname(), address.getStrasse(), address.getWohnort(), address.getId());

[/highlight]
 
Zuletzt bearbeitet:

Landei

Top Contributor
Prima. Aber dann solltest du die id auch als int und nicht als String einlesen. Dass diese normalerweise nicht veränderlich sein sollte, hatte ich ja schon erwähnt. Im String schreibst du dann "WHERE ID=%d "
 

babel

Aktives Mitglied
So da bin ich schon wieder :D, ich stehe hier vor einem rätsel und zwar hab ich ja diese datenbank aber das problem ist ja ich darf jetzt keine arrays/vectoren verwenden sondern ich muss die daten aus der datenbank direkt in der tabelle füllen, aber! wie kann ich dann rechnen? den ich hab mehrere methoden die ich für die ziseszins berechnung brauch und da arbeite ich mit vectoren :/
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
padde479 Zeile entfernen TableModel Java Basics - Anfänger-Themen 11
O TableModel Java Basics - Anfänger-Themen 8
E JTable + TableModel updaten? Java Basics - Anfänger-Themen 1
M TableModel Hintergrundfarbe Java Basics - Anfänger-Themen 6
GianaSisters Methoden eigenes TableModel -> removeRow möglich machen Java Basics - Anfänger-Themen 30
E Tablemodel füllen..mit gefilterten Daten Java Basics - Anfänger-Themen 2
K keine Reaktion im TableModel nach ändern der liste? Java Basics - Anfänger-Themen 2
K funktioniert in einem TableModel ein Initialisierungsblock? Java Basics - Anfänger-Themen 3
W Problem mit Serialisierung und TableModel Java Basics - Anfänger-Themen 3
J JTable aktualisieren wenn TableModel sich ändert Java Basics - Anfänger-Themen 6
Z TableModel Methode setValueAt Java Basics - Anfänger-Themen 9
w0ddes ImageIcon in Objektarray (TableModel) einfügen. Java Basics - Anfänger-Themen 7
C eigenes TableModel Java Basics - Anfänger-Themen 2
W Innerhalb TableModel auf aktivierte Reihe reagieren Java Basics - Anfänger-Themen 3
B JTable- TableModel und TableCellRenderer Konflikt Java Basics - Anfänger-Themen 4
J Vector - JTable - TableModel Java Basics - Anfänger-Themen 14
G TableModel Java Basics - Anfänger-Themen 7
M TableModel befüllen Java Basics - Anfänger-Themen 14
Q Eigenes TableModel - NullPointerException Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben