Mehrdimensionales Array in while-Schleife füllen und ausgeben

Masterpurzel

Mitglied
Hallo,

da mir letztens so gut geholfen wurde, gleich ein neues Problem:

ich will Daten in eine JTable einfügen mit einer while-Schleife.

ungefähr so:

Code:
//Tabelle definieren
String[] columnNames = {"Deutsch", "Japanisch"};
String[][] rowData = null;

while(rs.next()) {
    rowData = new String[][]{{rs.getString("deutsch"), rs.getString("japanisch")}};
}

JTable table = new JTable(rowData, columnNames);
jframe.add(new JScrollPane(table));

nur bekomme ich jetzt in der JTable immer nur den letzten Wert der DB ausgegeben. Wie kann ich es so lösen, das alle Werte in der JTable stehen.

Danke schon mal für jeden Hinweis!

Lg Masterpurzel
 
Das Problem das du hast ist, dass du in der WhileSchleife rowData immer neu setzt. So wird rowData immer und immer wieder überschrieben und schlussendlich bleibt dann natürlich nur das letzte...

Also solltest du rowData vorher setzen und dann das StringArray hochzählen.

Der abgebildete Code hier ist so nicht fehlerfrei lauffähig, da rowData nicht initialisiert wurde.
Wenn du die Größe von rs weißt, dann kannst du rowData wie im Kommentar initialiseren. Man könnte dann auch über eine for schleife nachdenken oder so.. wenn du die größe von rs nie weißt und nicht rausbekommen kannst, was ich irgendwie nicht glaube, dann könnte man alles z.b in eine ArrayListe packen, deren Länge durch 2 teilen(du hast ja immer 2Werte) und schon hättest du die initialisierungsgröße von rowData und dann kannst du die natürlich auch so füllen...
Java:
// Durch die fehlende Initialisierung nicht lauffähig, soll dir aber ne Idee vermitteln!!

//Tabelle definieren
String[] columnNames = {"Deutsch", "Japanisch"};
String[][] rowData = null;
//String[][] rowData = new String[2][rs.length];
// oder size oder count.... ich weiß ja nicht, was rs ist.
int index = 0;
 
while(rs.next()) {
    // 0 Ist ja Spalte Deutsch, 1 Spalte Japanisch
    rowData[0][index] = rs.getString("deutsch");
    rowData[1][index] = rs.getString("japanisch");
    index++;
}
 
JTable table = new JTable(rowData, columnNames);
jframe.add(new JScrollPane(table));
edit: okay, du hast die länge .. dnan kann das hier raus^^
 
Zuletzt bearbeitet:
Hallo Danke für deine Antwort,

rs ist mein Zeiger auf die Datenbank
Code:
ResultSet rs = s.getResultSet();

mit

Code:
int columns = rs.getRow();

bekomme ich die Menge heraus!

Leider bekomme ich folgede Ausgabe in der JTable:

Deutsch Deutsch
Japanisch Japanisch

richtig sein müsste es:

Deutsch Japanisch
Deutsch Japanisch
Deutsch Japanisch
...

Lg Masterpurzel
 
Zuletzt bearbeitet:
Hallo,

du hast jetzt zwei Möglichkeiten, wie du vorgehen kannst.

Wenn die die Anzahl der rows und die anzahl der columns vor der Iteration bekannt sind, kannst du entweder ein Array oder eine ArrayList mit diesen größen (columnLength und rowLength) anlegen.

Wenn die Anzahl der rows und die Anzahl der columns vor der Iteration nicht bekannt sind, solltest du eine LinkedList verwenden.

Ich empfehle dir auch den Zugriff auf die Datenbank innerhalb des TableModel zu kapseln, dann ist der Grad der Kopplung von der GUI an die Datenbank niedriger. Du könntest das Model dann durch den Konstruktor mit Daten aus der Datenbank befüllen (Model und DB müssen syncronisiert werden) oder immer bei einem getValue() eine entsprechende Abfrage auf die Datenbank machen (schlechtere Performance).
 
Java:
    //Tabelle definieren
      String[] columnNames = {"Deutsch", "Japanisch"};
      String[][] rowData = new String[2][rs.getRow()]; // ich war ma so frei
      int index = 0;
       
      while(rs.next()) {
          rowData[index][0] = rs.getString("deutsch");
          rowData[index][1] = rs.getString("japanisch");
          index++;
      }
Müsste das aussehen.. ein kleiner Denkfehler von mir ,.. ansonsten musst du mal sehen.. was die Zeile und was die Spalte ist.. :D
 
Zuletzt bearbeitet:
Den Tipp von Tikonteroga werde ich mal probieren.

Danke!

Jetzt sieht es so aus:

Code:
s = conn.prepareStatement("SELECT id, deutsch, japanisch FROM woerterbuch");
            s.executeQuery();
            ResultSet rs = s.getResultSet();
            rs.last();
            int columns = rs.getRow();
            rowData = new String[columns][columns];
            rs.first();
            int index = 1;
            while(rs.next()) {
            	//rowData = new String[][]{{rs.getString("deutsch"), rs.getString("japanisch")}};
            	rowData[index][0] = rs.getString("deutsch");
                rowData[index][1] = rs.getString("japanisch");
                index++;
            }
 
Zuletzt bearbeitet:
Normal fängt jegliches Feld(Array, egal wieviele Dimensionen) bei 0 an, weshalb auch
Java:
int index = 0
sein sollte. Sonst hast du ja ne leere Zeile, oder ?

Und du machst dein Feld viel zu groß.. oder hast du genau soviele Zeilen, wie Spalten?
Java:
 rowData = new String[columns][columns];
meine ich..solltest du ändern.
 
Normal fängt jegliches Feld(Array, egal wieviele Dimensionen) bei 0 an, weshalb auch
Java:
int index = 0
sein sollte. Sonst hast du ja ne leere Zeile, oder ?

Und du machst dein Feld viel zu groß.. oder hast du genau soviele Zeilen, wie Spalten?
Java:
 rowData = new String[columns][columns];
meine ich..solltest du ändern.

Danke für den Tipp, werde ich noch ändern!

PS: bei int index = 0 habe ich zum Schluss eine leere Zeile, aber der erste Eintrag fehlt!

Sonst passt alles :)

€dit: jetzt passt alles, war ein Fehler in der SQL Clausel!

Danke für die promte und nette Hilfe!
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück