Johnny90 Geschrieben 13. März 2009 Geschrieben 13. März 2009 (bearbeitet) Servus Ich habe mir ein eigenes TableModel programmiert: import javax.swing.table.AbstractTableModel; public class FahrdienstKundenTableModel extends AbstractTableModel { private static final long serialVersionUID = 1L; FahrdienstDatenbank m_oFahrdienstDatenbank = new FahrdienstDatenbank(); String[][] data = null; private String[] columnNames = {"Vorname", "Nachname", "Straße", "PLZ", "Wohnort", "Rufnummer", "Geburtstag"}; // Anzahl der Zeilen. wird von DB ausgelesen int iRowCount; String sqlStringGetKunden = "SELECT Kunde.Vorname, Kunde.Nachname, Kunde.[Straße+Hnr], Kunde.PLZ, Kunde.Wohnort, Kunde.Rufnummer, Kunde.Geburtsdatum FROM Kunde"; String sqlStringGetRows = "SELECT count(Kundennummer) FROM Kunde"; public int getColumnCount() { return 7; } public int getRowCount() { iRowCount = m_oFahrdienstDatenbank.getRowsFromDb(sqlStringGetRows); return iRowCount; } public String getColumnName(int col) { return columnNames[col]; } public Object getValueAt(int row, int column) { //data array wird gefüllt mit werten aus datenbank data = m_oFahrdienstDatenbank.getAllDataFromDb(sqlStringGetKunden, iRowCount, 7); return data[row][column]; } } Die Tabelle wird mit den Daten aus der Datenbank einwandrei angezeigt nur die Spaltennamen, werden nicht ausgegeben. Kann mir jemand bitte sagen wo ich hier den Fehler gemacht habe? Gruß Johnny Bearbeitet 13. März 2009 von Johnny90 Zitieren
VaNaTiC Geschrieben 13. März 2009 Geschrieben 13. März 2009 (bearbeitet) Hast Du Deiner JTable auch gesagt, dass Du den Header der Tabelle angezeigt haben willst? JTable.setAutoCreateColumnsFromModel(true); oder JTable.createDefaultColumnsFromModel(); Aber was anderes, Dein TableModel ist sehr ressourcenfressend! - data[][] solltest Du nur einmal ausführen! - und im Normalfall row und column auf ArrayIndexOutOfBoundsException prüfen. public Object getValueAt(int row, int column) { //data array wird gefüllt mit werten aus datenbank if ( data == null ) data = m_oFahrdienstDatenbank.getAllDataFromDb(sqlStringGetKunden, iRowCount, 7); if ( data != null && row < data.length && row >= 0 && data[row] != null && column < data[row].length && column >= 0 ) return data[row][column]; return null; } Dann musst Du nur noch ein reset() oder update() definieren und dort dann data = null; fireTable...Changed(); setzen, so dass beim nächsten Aufruf von getValueAt() wieder das Model geladen wird. Bearbeitet 13. März 2009 von VaNaTiC Zitieren
Johnny90 Geschrieben 13. März 2009 Autor Geschrieben 13. März 2009 danke für die antwort ich hab aber vergessen, dass man die JTable in ein JScrollPane einfügen muss um die Spaltennamen anzeigen lassen zu können... jetz funktionierts das mit dem resourcenfressen is mir auch schon aufgefallen hätt ich wahrscheinlich später noch gefragt wie ich das am besten umgehe. top, dass du mir das schon so geschrieben hast also danke für die hilfe Gruß Johnny Zitieren
Saban Geschrieben 14. März 2009 Geschrieben 14. März 2009 Hallo Zusammen! ich hab da auch mal eine Frage! Wie meinst du das mit dem nur einmal ausführen der data[][]. Ich habe nämlich auch ein Table (mit einem TableModel) und das wird erst mit einem leeren Array angezeigt so bald jedoch der User wünscht das sie befüllt wird würd das Array mit Daten voll gepumpt und das TableModel neu initialisiert und die Daten angezeigt. Das alles passiert jedes mal wenn der User Kritierien zur Anzeige ändert. Geht das auch perfomanter? Weil ich irgendwie grad auf dem Schlauch stehe wie das gemeint war mit dem Ressourcen fressend :eek MfG Saban Zitieren
VaNaTiC Geschrieben 16. März 2009 Geschrieben 16. März 2009 Für Dein Problem Saban bräuchte man mehr Infos ob das optimiert werden kann. Fakt ist das Problem hier war, dass in getValueAt(int row, int col) jedesmal das SELECT-Query an die Datenbank abgesetzt wurde. Wenn man sich nun überlegt, dass die JTable diese Funktion pro Zeile MAL pro Spalte aufruft, kannst Du Dir vorstellen, wie oft das SELECT umsonst ausgeführt wird. Ganz genau AnzahlZeilen * AnzahlSpalten - 1! Das war damit gemeint. Wenn Du der Meinung bist, dass bei Dir auch irgendwas nicht passt, dann poste doch in einem neuen Thread ein bisschen Quellcode und Infos. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.