JTable, getValueAt und eigene Spalten

Semour

Grünschnabel
Hallo liebe Forumsuser,

seit ein paar Tagen treibt mich ein Problem um, das sich einfach nicht lösen lässt. Vielleicht hat ja jemand eine Antwort parat.

Zum Problem:

Ich habe ein eigenes TableModel, abgeleitet vom AbstractTableModel. Dieses Model lädt Daten dynamisch aus einer Datenquelle. Hier liegt auch nicht das Problem.

Zuerst habe ich eine JTable erstellt und diese hat dank der Option setAutoCreateColumnsFromModel die Spalten immer selbst erzeugt und richtig benannt.

Die Anzeige lief problemlos.

Dann kam mir in den Sinn, dass ich die Spalten gerne in anderer Größe hätte.
Dazu habe ich oben genannte Option deaktviert und musste feststellen, dass nun die Spalten wie gewünscht angezeigt werden, aber die Daten von der JTable nicht mehr richtig aus dem Datenmodel gelesen werden.

Folgendes war festzustellen.

Mit der Option setAutoCreateColumnsFromModel wird die Methode getValueAt bei 3 Spalten immer richtig aufgerufen, also getValueAt(0,0), getValueAt(0,1), getValueAt(0,2), getValueAt(1,0), getValueAt(1,1),getValueAt(1,2), ...


Ohne die Option setAutoCreateColumnsFromModel wird die Methode getValueAt bei 3 Spalten immer so aufgerufen, also getValueAt(0,0), getValueAt(0,0), getValueAt(0,0), getValueAt(1,0), getValueAt(1,0),getValueAt(1,0), ...

Das heißt, er ruft die Methode richtig in der Anzahl der Spalten auf, aber setzt den Parameter ColumnIndex immer 0.

Ich kann dieses Verhalten nicht nachvollziehen.

Vielleicht kennt ja jemand das Problem und eine Lösung. Der Quellcode ist sehr umfangreich und eignet sich daher schlecht hier veröffentlicht zu werden.

Schon mal vielen Dank im Voraus
Semour
 
Hast du die Methode getColumnCount() richtig implementiert?
Woher holst du dir jetzt die die Spaltennamen?
 
Hallo mki_germo,

wenn die Methode getColumnCount() aus dem TableModel gemeint ist, diese ist richtig implementiert. Sie wird auch nur aufgerufen, wenn die Spalten aus dem Model erzeugt werden. Die Spaltenbeschreibung liegt in einer eigenen Klasse vor.
Es wird also die selbe Information genutzt, egal ob die Spalten automatisch erzeugt werden oder von mir per Hand.

Danke für deine Mühe
Semour
 
So, hier mal der Code mit dem es schief geht.


Code:
	private JTable getListview(){
		if(listview==null){
			ktm = new KatalogTableModel();
			DefaultTableColumnModel tcm = new DefaultTableColumnModel();
				
			ColumnDescription cd = f.getColumnDescription();
			LinkedList<DescriptionItem> ld = cd.getSelectedColumns();
			for(int ix=0;ix<ld.size();ix++){
				DescriptionItem di = ld.get(ix);
				TableColumn col = new TableColumn();
				col.setPreferredWidth(di.getColumnWidth());
				col.setHeaderValue(di.getColumnName());
				tcm.addColumn(col);
			}
			listview = new JTable(ktm,tcm);
			listview.setAutoCreateColumnsFromModel(false);
			listview.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
		

		}
		return listview;
	}

Lässt man die Columnerzeugung weg und setzt listview.setAutoCreateColumnsFromModel(true);
dann funktioniert die Abfrage aus dem TableModel.

Grüße
Semour
 
Versuch es mal so.
Code:
TableColumn col = new TableColumn(ix);

Da du den Standard-Kontruktor nutzt, wird der Column-Index immer auf 0 gesetzt.

MFG

Sascha
 
Zurück