JTable Datensätze bleiben immer gleich

c-i-k-o

Mitglied
Hallo Zusammen,

ich bin gerade dabei eine Tabelle mit JTable zu basteln.
Leider habe ich das Problem, dass in jeder Zeile die gleichen Datensätze angezeigt werden.

wie z.b.

ID Name Vorname
1 Muster Max
1 Muster Max
1 Muster Max
1 Muster Max
... usw.

Dazu kommt auch eine Fehlermeldung:
java.lang.ArrayIndexOutOfBoundsException: 27 >= 27Fehler
(27 ist die Anzahl der Datensätze in der DB).

ich stell den Quellcode einfach mal ein vielleicht habt ihr eine Idee.

Java:
import java.util.* ;
import javax.swing.*;
import java.awt.*;
import java.sql.ResultSet;
import java.sql.Statement;
import javax.swing.table.DefaultTableModel;
class Personal 
{

    public static void main ( String[] args)
    {
        SqlKlasse sql = new SqlKlasse();
        JFrame f = new JFrame();
        f.setVisible(true);
        f.setBounds(200,200,700,500);

        Vector <String> haeder = new Vector <String>();
        Vector<Vector<String>> rows = new Vector<Vector<String>>();
        Vector <String> column = new Vector <String>();
        haeder.addElement("ID");
        haeder.add("Name");
        haeder.add("Vorname");
        JTable tbl = new JTable(rows, haeder);
        JScrollPane sp = new JScrollPane(tbl);
        f.add(sp);

        try 
        {
            sql.openConnection();
            Statement statement = sql.connection.createStatement();
            ResultSet rs = statement.executeQuery ("select * from ma");

            for (int i = 0 ; i <rows.capacity();i++)
            {
                while (rs.next())
                {
                    column.addElement(rs.getString(1));
                    column.addElement(rs.getString(2));
                    column.addElement(rs.getString(3));
                    rows.add(column);  
                }

                rows.elementAt(i);
            }
            DefaultTableModel model = (DefaultTableModel)tbl.getModel();
            model.addRow(rows);
            sql.connection.close();
        }catch(Exception e)
        {
            System.out.println("Fehler+e");
        }

    }

}

irgendwie komme ich nicht mehr weiter.
Freue mich auf jede Hilfe

Gruß
c-i-k-o
 
Moin,

in welcher Zeile tritt die Exception denn auf ???:L

BTW: wozu ist denn das einsame "rows.elementAt(i)" nach der while-Scheife gut ???:L

Gruß
Klaus
 
Das liegt daran, dass Du den Vector "column" (der entgegen seinem Namen wohl die Zeileninhalte speichern soll) immer wieder verwendest.
Du musst für jede Zeile auch einen neuen Vector verwenden, sonst steht in Deiner Tabelle immer die zuletzt eingelesene Zeile.
 
Vielen Dank für die super schnellen Antworten...


Das liegt daran, dass Du den Vector "column" (der entgegen seinem Namen wohl die Zeileninhalte speichern soll) immer wieder verwendest.
Du musst für jede Zeile auch einen neuen Vector verwenden, sonst steht in Deiner Tabelle immer die zuletzt eingelesene Zeile.

Kannst du mir das vielleicht einwenig erklären. ich verstehe nicht so ganz wie ich das umsetzen soll..
Das was ich mir jetzt darunter vorstelle ist:

Java:
while (rs.next())
                {
                    column.addElement(rs.getString(1));
                    column.addElement(rs.getString(2));
                    column.addElement(rs.getString(3));
                    rows.add(column);  
                }

while (rs.next())
                {
                    column2.addElement(rs.getString(1));
                    column2.addElement(rs.getString(2));
                    column2.addElement(rs.getString(3));
                    rows.add(column2);  
                }
column3....column4....

das wird wohl kaum richtig sein...

Würde mich freuen, wenn du mir das bisschen erklären könntest.(Ich bin nämlich noch sehr sehr neu in der Java-Welt 😳)
 
Moin,

in welcher Zeile tritt die Exception denn auf ???:L

Also die Exception steht in der 48.-51. Zeile.

BTW: wozu ist denn das einsame "rows.elementAt(i)" nach der while-Scheife gut ???:L

Gruß
Klaus

Vor der While-Schleife habe ich eine For-Schleife eingebaut, weil sonst immer nur eine Zeile ausgegeben wird... Es sollen aber alle Datensätze aus der DB ausgegeben werden, und das klappt nicht ???:L

und da habe ich mir gedacht, dass ich die Schleife bis zur Kapazitätsgrenze (i <rows.capacity()) hochzählen lasse und dann jeweils die Zeilen per row.elementAt(i) ausgeben lasse... denn mit rs.next() wird nur ein Datensatz ausgegeben.
 
Zuletzt bearbeitet:
Die Schleife über den Vector rows ist nicht nur nutzlos sondern falsch.

Es reicht vollkommen per while über den ResultSet zu iterieren. Hier muss aber für jede neue Zeile auch ein neuer Vector angelegt
Code:
new Vector <String>()
und mit den Daten des ResultSets befüllt werden
 
ok jetzt habe ich es auch verstanden. Der Vector muss in bei jedem Durchlauf der while Schleife neu angelegt werden. Logisch (auch wenns etwas spät ist habe ich es bemerkt 🙂)

aber jetzt das Problem.. wenn ich die for-Schleife weglasse, dann werden nur 5 Zeilen ausgegeben 🙁 (ist mit sicherheit wieder was simpeles wovon ich keinen Plan habe 😳)
 
ist
> model.addRow(rows);
noch aktiv? damit wird alles als nur eine Row hinzugefügt

setDataVector() ist für mehrere Rows gedacht, oder in der Schleife gleich mehrfach addRow()

bezieht sich
> werden nur 5 Zeilen ausgegeben
generell nur auf die GUI?
schlechtes Vorgehen, immer erst mit System.out.println() anfangen, logge in der Schleife, wie oft wird diese durchlaufen?
mit konkret welchen Einträgen, falls es wirklich nur 5 sind, welche 5, von wievielen und welche in der DB?
 
und ich verstehe nicht, was du nicht verstehst,
du kannst es dabei belassen oder erklären was du nicht verstehst

angefangen mit
Java:
ist
> model.addRow(rows);
noch aktiv? damit wird alles als nur eine Row hinzugefügt
ich werde es nicht neuformulieren,
ist der Sinn dieser Aussage unklar, auch nicht durch Fragen/ Vermutungen/ Tests/ Nachschlagen der Methodenbeschreibung
in irgendeiner Form näher zu ermitteln?
 
Du siehst nur 5, doch es sind 27?

- Zähl in der schleife mit wieviele Datensätze es sind
- Wenn mehere drinnen sind, dann versuch es doch mit: setAutoscrolls(true) bei der table
 
Danke an Alle...
ich habe wie SlaterB es empfohlen hat, model.addRow(rows); einfach weggelassen... jetzt klappt es...



Vielen Dank nochmal an Alle!
 
das war zwar nicht genau mein Tipp, aber jetzt sehe ich, dass das durchaus besser dadurch wird,

setVisible(true) sollte übigens ganz am Ende,
sonst können spätere Änderungen immer aufwendig werden,
ohne einen Aufruf am Model würde das auf Änderungen gar nicht reagieren, fireTableDataChanged() usw. empfehlenswert,

aber wenn alles in der Initialisierung stattfindet, welche durch setVisible(true) abgeschlossen wird, dann akzeptabel
 
Danke für den Tipp, werde ich auf jeden ändern.

Ich kenn mich leider noch nicht so gut aus in der Java-Welt, bin noch in der Lernphase.... Aber das mit fireTableDataChanged() u.ä. werde ich mir alles genauer anschauen 😉
 

Zurück
Oben