Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

TableModel

Empfohlene Antworten

Veröffentlicht

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 von Johnny90

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 von VaNaTiC

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

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

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.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.