zweidimensionales Array anlegen und mit DB-Daten füllen

pappender

Aktives Mitglied
Hallo,

ich habe ein Problem mit einem Array.
Ich möchte ein Array erstellen und es dann mit Daten aus einer Datenbank füllen.
Folgender Codeschnipsel:
Java:
int row = 0;
String[][] tabledata = new String[300][65];
while(rs.next()){
                        tabledata[row][4] = rs.getString("name");
                        row++;
                        tablePlanungModel.addRow(tabledata);
}
Wenn ich die Daten in der Konsole ausgebe, werden die gewünschten Daten angezeigt:
Java:
System.out.println(rs.getString("name"));

In der eigentlichen JTable, in der die Daten stehen sollen, steht lediglich:
[Ljava.lang.String;@9991e3

Was mache ich falsch?
 
Oder hier noch mal mit Object:
Java:
               Statement stmt;
                try {
                 
                   String url = "jdbc:mysql://"+hostname+":"+port+"/"+dbname;
                   conn = DriverManager.getConnection(url, user, password);
                 
                    stmt = conn.createStatement();
                    ResultSet rs = stmt.executeQuery("SELECT name FROM ma");
                 
                   rs.first();
                   rs.last();
                   int rowCnt = rs.getRow() + 1;
                   rs.first();
                    Object[][] tabledata = new Object[rowCnt][65];
                    Object[] tableColumnsName = new Object[65];
                 
                    tableColumnsName[0] = "Std";
                    tableColumnsName[1] = "Mitarbeiter";
                    tableColumnsName[2] = "AZ-Verteilung";
                    int z = 3;
                    for(int i = 1; i <= 31; i++){
                        tableColumnsName[z] = (i + ".");
                        tableColumnsName[z + 1] = ("real");
                        z = z + 2;
                    }
                    tablePlanungModel.setColumnIdentifiers(tableColumnsName);
                 
                    while(rs.next()){
                        System.out.println(rs.getString("name"));
                       tabledata[rs.getRow()][4] = rs.getString("name");
                        tablePlanungModel.addRow(tabledata);
                    }
                 
                 
                    rs.close();
                    stmt.close();
                    conn.close();
                 
               }
               catch (SQLException sqle) {
                  JOptionPane.showMessageDialog(null, "SQLException: " + sqle.getMessage() + "\nSQLState: " + sqle.getSQLState() + "\nVendorError: " + sqle.getErrorCode());
               }
Aber auch hier steht in der Tabelle: [Ljava.lang.Object;@9991e3
 
Zuletzt bearbeitet von einem Moderator:
Moin,

"[Ljava.lang.String;@9991e3" ist die Referenz des tablePlanungModel !!
Du solltest schon einen einzelnen String mit tabledata[n][m] übergeben ...

Aber benötigst Du wirklich ein Stringarray mit 19500 Einträgen??
Zudem: bei mehr als 300 Strings bekommst Du eine IndexOuitOfBounds-Exception !!

Gruß Klaus
 
Hallo,

Danke für den Hinweis.
Naja, es werden wohl bis zu 300 Zeilen und 65 Spalten sein.

Ich habe es jetzt mit Vector gelöst:
Java:
                    while(rs.next()){
                       Vector<String> tabledata = new Vector<String>();
                       tabledata.add(rs.getString("ma_name"));
                       tablePlanungModel.addRow(tabledata);
                    }
 
Du solltest schon einen einzelnen String mit tabledata[n][m] übergeben ...
Sollte er dem Model nicht immer eine ganze Zeile übergeben (also 65 Spalten)? Deshalb sollte tabledata
auch nur ein eindimensionales Array sein das die Daten für eine Zeile aufnimmt. Und ich nehme an der Code oben ist nur ein Ausshnitt weil du nur in Spalte 4 einen Namen einfügst ?

Edit: ok, zu spät
 
Ich würde dir empfehlen keinen Vector zu benutzten, außer du willst etwas synchronisiert ablaufen lassen. In vielen Fällen möchte man das aber nicht und man verliert Performance. Die ArrayList kann das gleiche wie ein Vector hat jedoch den Vorteil das die nicht synchronisiert wird.

Wenn man nach Vector vs ArrayList googlet erhält man noch weitere und bessere Erklärungen. 🙂
 
Ich würde dir empfehlen keinen Vector zu benutzten
Er hat das sicher so gemacht weil bei addRow ein Vector angegeben werden kann. Aber ich weiss nicht warum er es sich so schwer macht. Da es sich bei ihm ja scheinbar um eine Tabelle mit 65 Spalten vom Typ String handelt könnte er ja ganz einfach ein

"String[] tabledata = new String[65]" anlegen und seine Daten da rein schreiben. Und so sieht dann das
hinzufügen zum Model aus:

"tablePlanungModel.addRow(tabledata);"

Der ursprüngliche Fehler war ja nur dass tabledata zweidimensional war.
 
Na ich bin Neuling in Java und objektorientiert, das muss ich mir noch alles bisl im Kopf zurecht rücken.

Der Hintergrund ist Folgender:
Daten sollen aus einer Tabelle gelesen werden. Das dürften so ca. 20.000 Zellen werden, aber das variiert.
In der Tabelle möchte ich die Daten ändern können: Hinzufügen, Ändern und sogar das Löschen soll möglich sein. Nach Abschluss sollen die geänderten Zellen wieder in die Datenbank geschrieben werden. Vielleicht lasse ich die Veränderung auch sofort nach Verlassen der Zelle in der Datenbank speichern, das weiß ich noch nicht, was am effektivsten ist, ich werde beide Varianten testen.

Jedenfalls wollte das mit dem zweidimensionalen Array machen, damit ich jede Zelle ansprechen kann: Zeile, Spalte wie im Koordinatensystem.
 
Heisst das du wolltest dir die Daten ausserhalb der Tabelle noch einmal halten ? Du kannst das schon machen aber dann musst du beim addRow(...) eben die Zeilennummer mit angeben und nicht einfach die ganzen "tabledata".

Edit: aber bei deiner Vector-Lösung hast du das ja auch nicht so gemacht. Ein Vector steht doch für eine Zeile
 
Oh sorry, ich meinte die Daten kommen aus einer Datenbanktabelle (MySQL).
Die Daten sollen in der JTable manipuliert werden können und dann geht’s wieder zurück in die Datenbank.

Also anscheinend seht Ihr es so, das Vector wohl nicht so das richtige dafür ist. Dann werde ich es wieder auf Array ändern.
Ich werde mir sowieso noch mal das Thema Vector vs ArrayList genauer anschauen.
 
Wenn du eine Liste verwendest, die String[]-Arrays verwendet, kannst du damit deine Spalten und Zeilen Abbilden;
Java:
List<String[]> tabelle= new ArrayList<String[]>();
for(String[] zeile : tabelle) {
    for(String zelle : zeile) {
        // Inhalt ausgeben
    }
}

Die Liste musst du dann natürlich noch befüllen.

Die Abbildung ist dann dein Datenmodel (Model) und die JTable ist die Darstellung der Daten (View). Die beiden musst du dann noch geeignet verbinden.

Wenn du nun die Daten manipulieren willst wird das zugrundelegende Datenmodel verändert.
 
Table und TableModel bewerkstelligen ja gerade die Trennung von Daten und Anzeige. Da heisst er schreibt seine Daten in das TableModel Und gibt der Table das TableModel bekannt. Insofern braucht er doch nicht nochmal eine ArrayList um sich die Daten ausserdem nochmal zu merken. Das TableModel bietet ja Zugriffsmethoden auf die Daten. Verändert werden sie im TableModel und von da aus liest er sie wieder zur Speicherung in der Datenbank aus. Und so wie ich seinen ursprünglichen Code deute hatte er doch schon alles er hat die Daten nur nicht richtig in sein TableModel geschrieben.
 
Ich kenne mich leider mit Swing nicht so aus, deswegen ist mir das TableModel nicht bekannt, wenn es so eine Trennung schon gibt, dann kann mein Post ignoriert werden.

Wieso wird nun eine Array Vector ArrayList dann überhaupt benötigt. Dann kann man doch einfach direkt in das TableModel schreiben?
 
Also um dir mal eine Vorlage zu geben, ich würde deinen ursprünglichen Code wie folgt ändern und dann sollte das funktionieren:

Code:
               Statement stmt;
                try {
                
                   String url = "jdbc:mysql://"+hostname+":"+port+"/"+dbname;
                   conn = DriverManager.getConnection(url, user, password);
                
                    stmt = conn.createStatement();
                    ResultSet rs = stmt.executeQuery("SELECT name FROM ma");
                
                   rs.first();
                   rs.last();
                   int rowCnt = rs.getRow() + 1;
                   rs.first();
                    Object[] tabledata = new Object[65];
                    Object[] tableColumnsName = new Object[65];
                
                    tableColumnsName[0] = "Std";
                    tableColumnsName[1] = "Mitarbeiter";
                    tableColumnsName[2] = "AZ-Verteilung";
                    int z = 3;
                    for(int i = 1; i <= 31; i++){
                        tableColumnsName[z] = (i + ".");
                        tableColumnsName[z + 1] = ("real");
                        z = z + 2;
                    }
                    tablePlanungModel.setColumnIdentifiers(tableColumnsName);
                
                    while(rs.next()){
                        System.out.println(rs.getString("name"));
                       tabledata[4] = rs.getString("name");
                        tablePlanungModel.addRow(tabledata);
                    }
                
                
                    rs.close();
                    stmt.close();
                    conn.close();
                
               }
               catch (SQLException sqle) {
                  JOptionPane.showMessageDialog(null, "SQLException: " + sqle.getMessage() + "\nSQLState: " + sqle.getSQLState() + "\nVendorError: " + sqle.getErrorCode());
               }
 
Dann kann man doch einfach direkt in das TableModel schreiben?
Ganz genau !!

Edit: Das TableModel hat Methoden um ganze Zeilen, ganze Spalten, einzelne Werte mit Zeilen- und Spaltenangabe zu lesen und zu schreiben. Und es bewerkstelligt u.a. im Zusammenspiel mit Table auch die Koordination der Reihenfolge der Daten in den Zeilen, insbesondere wenn du die Elemente nach einzelnen Spalten umsortierst. Dann wird nur die Anzeige umsortiert. Nicht die Daten im Model und man braucht eine Zuordnung.
 

Zurück
Oben