Swing TableModel fireTableDataChanged führt zu IndexOutOfBoundsException

ergin

Mitglied
Hi,
ich habe ein Problem beim Zusammenspiel von den Klassen JTable, TableModel und TableRowSorter. In meiner Applikation verwende ich eine von JTable abgeleitete Klasse und eine vom DefaultTableModel. In meinem TableModel wird in der SetValueAt Methode eine Zeile gelöscht und ein fireTableDataChanged() aufgerufen. Das ganze endet mit einer IndexOutOfBoundsException oder ArrayIndexOutOfBoundsException Fehlermeldung. Nachdem dem Aufrufen von fireTableDataChanged wird die getRowCount Methode vom TableModel nicht aufgerufen. In der von JTable abgeleiteten Klasse wird ein TableRowSorter verwendet. Wenn ich den TableRowSorter aus dem Code entferne, funktioniert alles. Alternativ, wenn ich dem TableModel eine Referenz vom TableRowSorter übergebe und vor dem fireTableDataChanged() die Methode rowsDeleted vom TableRowSorter aufrufe funktioniert es auch. Hat jemand eine Idee?
 

Wildcard

Top Contributor
Hätte ich gemacht, aber das ganze ist etwas aufwändiger und erfordert eine entsprechende DB.
Wenn du DB sagst, hoffe ich mal das du die DB nicht im Event Dispatcher Thread ansprichst.
Wenn du also (wie ich vermuten würde) mindestens 2 Threads hast (EDT und DB Thread), dann ist dir hoffentlich klar dass du dein Table Model nicht aus dem DB Thread aktualisieren kannst weil Swing nicht threadsicher ist.
Meine Glasskugel sagt das du das an mindestens einer Stelle nicht beachtet hast und daher threading issues hast.
 

ergin

Mitglied
Ich habe nur ein Thread.

Das TableModel sollte doch den TableRowSorter mitbenachrichtigen oder? Was mich wundert, dass die Methode getRowCount nach fireTableDataChanged nicht aufgerufen wird.
 

Marco13

Top Contributor
Abgesehen von der Frage nach den Threads klingt es schon nach strukturellem Murks, wenn man eine DB braucht, um ein GUI starten zu können. Kann man den DB-Teil nicht irgendwie rausschälen und stattdessen irgendwelche Dummy-Daten verwenden?
 

ergin

Mitglied
Table
Java:
import javax.swing.JTable;
import javax.swing.table.TableRowSorter;

@SuppressWarnings("serial")
public class DbTable extends JTable {
	private DbTableModel tableModel = new DbTableModel();

	private final TableRowSorter<DbTableModel> rowSorter = new TableRowSorter<DbTableModel>();

	/**
	 * @return the rowSorter
	 */
	public TableRowSorter<DbTableModel> getRowSorter() {
		return rowSorter;
	}


	/**
	 * Initialize table model and row sorter
	 */
	public void initTableModel() {
		tableModel.fillModel();
		setModel(tableModel);
	}

	public void setInitialSort() {
		rowSorter.setModel(tableModel);
		
		rowSorter.toggleSortOrder(0);

	}

	public void updateModel() {
		initTableModel();
		setInitialSort();
	}

}

TableModel
Java:
import java.util.Vector;

import javax.swing.table.AbstractTableModel;

@SuppressWarnings("serial")
public class DbTableModel extends AbstractTableModel {

	private String[] columnNames = { "First Name", "Last Name", "Sport", "# of Years", "Vegetarian" };

	private Vector<Vector<Object>> rowVector = new Vector<Vector<Object>>();
	private Vector<Object> columnVector = new Vector<Object>();

	public DbTableModel() {
		super();
	}

	@Override
	public int getRowCount() {
		return rowVector.size();
	}

	@Override
	public int getColumnCount() {
		return columnVector.size();
	}

	@Override
	public Object getValueAt(int rowIndex, int columnIndex) {
		return rowVector.get(rowIndex).get(columnIndex);
	}

	@Override
	public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
		deleteEntry(rowIndex);
	}

	@Override
	public String getColumnName(int column) {
		return columnNames[column];
	}

	@Override
	public boolean isCellEditable(int rowIndex, int columnIndex) {
		return true;
	}

	@Override
	public Class<?> getColumnClass(int columnIndex) {
		return getValueAt(0, columnIndex).getClass();
	}

	public void fillModel() {
		columnVector = new Vector<Object>();
		columnVector.add("Max");
		columnVector.add("Mustermann");
		columnVector.add("Lernen");
		columnVector.add(new Integer(3));
		columnVector.add(new Boolean(true));
		rowVector.add(columnVector);

		columnVector = new Vector<Object>();
		columnVector.add("Peter");
		columnVector.add("Müller");
		columnVector.add("Badminton");
		columnVector.add(new Integer(5));
		columnVector.add(new Boolean(false));
		rowVector.add(columnVector);

		fireTableDataChanged();

	}

	public boolean deleteEntry(int index) {
		rowVector.remove(index);
		fireTableDataChanged();

		return true;
	}
}

BeispielAppl.
Java:
import javax.swing.JFrame;


public class TableTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		JFrame frame = new JFrame("Table Test");
		DbTable table = new DbTable();
		table.updateModel();
		frame.add(table);
		frame.setSize(400, 300);
		frame.pack();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);

	}

}

Wenn man die Zeile "rowSorter.toggleSortOrder(0);" auskommentiert oder die Methode "public TableRowSorter<DbTableModel> getRowSorter()" weglässt funktioniert es.
 

Marco13

Top Contributor
EDIT: Ja, das war dann wohl egal...

Das hilft zumindest etwas weiter... In setValueAt wird eine Zeile gelöscht - ist das Absicht? Das macht IMHO keinen Sinn ...
1. setValueAt(1,1) aufrufen (dabei die Zeile 1 löschen)
2. Den Event verarbeiten, der sagt, dass (1,1) sich geändert hat
-> (1,1) gibt's nicht mehr -> Crash

Falls das nur für das Beispiel war: Wie und wo und wann tritt den die Exception im echten Fall auf?
 

ergin

Mitglied
EDIT: Ja, das war dann wohl egal...

Das hilft zumindest etwas weiter... In setValueAt wird eine Zeile gelöscht - ist das Absicht? Das macht IMHO keinen Sinn ...
1. setValueAt(1,1) aufrufen (dabei die Zeile 1 löschen)
2. Den Event verarbeiten, der sagt, dass (1,1) sich geändert hat
-> (1,1) gibt's nicht mehr -> Crash

Falls das nur für das Beispiel war: Wie und wo und wann tritt den die Exception im echten Fall auf?

Anmerkung: Löschen von Tabelleneinträgen in der "setValueAt" Methode führt nicht zum Absturz.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Swing Daten in JTable wiedergeben per TableModel und MVC Pattern AWT, Swing, JavaFX & SWT 16
C TableModel zugehörige Table ermitteln AWT, Swing, JavaFX & SWT 3
E Eigenes TableModel für ArrayList<String[]> AWT, Swing, JavaFX & SWT 5
W Neues TableModel und JTable wird nicht refreshed AWT, Swing, JavaFX & SWT 3
D Swing JTable TableModel + RowCount AWT, Swing, JavaFX & SWT 18
JAVAnnik Problem mit TableModel AWT, Swing, JavaFX & SWT 3
S Swing Setzen von TableModel liefert NullPointer AWT, Swing, JavaFX & SWT 6
S TableModel Header wird nicht angezeigt AWT, Swing, JavaFX & SWT 5
K verständnissproblem mit TableModel AWT, Swing, JavaFX & SWT 2
K zwei TableModel AWT, Swing, JavaFX & SWT 9
N Swing Eintrag in JTable an dessen TableModel weiterreichen AWT, Swing, JavaFX & SWT 3
hdi Swing Komisches Problem mit TableModel & setAutoCreateRowSorter AWT, Swing, JavaFX & SWT 2
F Tablemodel zu mehreren Tabellen AWT, Swing, JavaFX & SWT 6
K JTable +TableModel --> Anpassung der Tabellengröße (Zeilenanzahl) AWT, Swing, JavaFX & SWT 3
K TableModel mit Daten aus Datenbank füllen AWT, Swing, JavaFX & SWT 7
K TableModel Daten übergeben AWT, Swing, JavaFX & SWT 9
L Klick auf JTable -> EditorPane manipulieren, Fragen zu TableModel AWT, Swing, JavaFX & SWT 9
X Swing Daten aus Vector ins TableModel ?? AWT, Swing, JavaFX & SWT 12
E JTable und tablemodel Verständnisproblem AWT, Swing, JavaFX & SWT 3
C Kann Konstruktor von eigenem TableModel nicht nutzen AWT, Swing, JavaFX & SWT 2
D eigenes Tablemodel, Zeile löschen ArrayindexOOB excp AWT, Swing, JavaFX & SWT 4
P Eigenes TableModel abgeleitet von AbstractTableModel (neue rows nicht sichtbar) AWT, Swing, JavaFX & SWT 6
S Table oder TableModel so ueberschreiben, dass Columns minimale Breite haben? AWT, Swing, JavaFX & SWT 2
R JTable - TableModel AWT, Swing, JavaFX & SWT 6
D JTable - TableColumnModel - TableModel AWT, Swing, JavaFX & SWT 3
S JTable nimmt TableModel nicht an AWT, Swing, JavaFX & SWT 4
D Mehrere CheckBoxen im TableModel wechselseitig ausschließen AWT, Swing, JavaFX & SWT 5
R TableModel und Columnmodel - Zusammenspiel? AWT, Swing, JavaFX & SWT 2
G TableModel mit anderen Spalten AWT, Swing, JavaFX & SWT 4
G JTable - TableModel aus ArrayList AWT, Swing, JavaFX & SWT 8
D TableModel + Daten bearbeiten + Daten zurückschreiben AWT, Swing, JavaFX & SWT 9
A JTable, eigenes TableModel und dessen Objekte AWT, Swing, JavaFX & SWT 4
G Frage zu JTable und TableModel AWT, Swing, JavaFX & SWT 4
O TableModel AWT, Swing, JavaFX & SWT 12
V Vector->TableModel->RowSorter:Bei Markierung Index im AWT, Swing, JavaFX & SWT 2
S Daten aus editierbaren TableModel lesen AWT, Swing, JavaFX & SWT 7
F TableModel Spaltenkoepfe benamen, wie? AWT, Swing, JavaFX & SWT 2
F Wie MouseListener bei TableModel anmelden? AWT, Swing, JavaFX & SWT 3
G JTable, TableModel und CellRenderer AWT, Swing, JavaFX & SWT 3
R DataVector bei TableModel - Class Cast Exception AWT, Swing, JavaFX & SWT 9
N TableModel mit CheckBox? AWT, Swing, JavaFX & SWT 5
J Tablemodel AWT, Swing, JavaFX & SWT 2
G jTable + ScrollPane (+ TableModel) AWT, Swing, JavaFX & SWT 7
D invokeLate bei änderung im TableModel? AWT, Swing, JavaFX & SWT 4
G TableModel von JTable wieder entfernen AWT, Swing, JavaFX & SWT 10
G TableModel auswerten und in Datei schreiben AWT, Swing, JavaFX & SWT 3
P JTable TableModel JFreeReport AWT, Swing, JavaFX & SWT 4
T anlegen einer jTable mit TableModel AWT, Swing, JavaFX & SWT 3
J Swing MVC - JTable - fireTableDataChanged AWT, Swing, JavaFX & SWT 6
S Methode fireTableDataChanged() AWT, Swing, JavaFX & SWT 2
hdi Swing JTable: Concurrency fireTableDataChanged() + RowSorter? AWT, Swing, JavaFX & SWT 5
G JTable aktualisieren fireTableDataChanged()? AWT, Swing, JavaFX & SWT 1
G fireTableDataChanged() geht das auch ohne vector? AWT, Swing, JavaFX & SWT 13
W Problem mit JTable und fireTableDataChanged() AWT, Swing, JavaFX & SWT 13
princess_sara1997 .jar Datei führt den Code nicht richtig aus AWT, Swing, JavaFX & SWT 19
E ActionListener führt falsche Funktion aus AWT, Swing, JavaFX & SWT 6
L Swing ActionListener führt seine Aufgabe nur teilweise aus. AWT, Swing, JavaFX & SWT 7
S Zeichnen führt zu transparentem Frame AWT, Swing, JavaFX & SWT 6
G zu viele/große BufferedImage führt zu Java heap space AWT, Swing, JavaFX & SWT 5
D Wechsel in Taskleiste führt zu verschwninden von Dialog AWT, Swing, JavaFX & SWT 18

Ähnliche Java Themen


Oben