# JTable aktualisieren



## Kim (14. Sep 2010)

Hallo, ich hab viel zum Thema gefunden, jedoch nichts passendes.

Ich bekomm meine Daten aus einer Datenbank. meine Tabelle bekommt ein DefaultTableModel.
Nun möchte ich in der Datenbank Datensätze löschen und meine Tabelle, soll auch gleich aktualisiert werden. (Löschen ist kein Problem, ich hänge an der Aktualisierung)

Ich lösche eine Zeile mit: 
*meinmodel.removeRow(0);*

Danach soll die Tabelle aktualisiert werden.

Versucht habe ich folgendes : 
*repaint(), *

*tabelle.setModel(meinmodel) *// was mir selbst am Sinnvollsten vorkommt.
      doch dann kommmt: Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 8 >= 8


Was funktioniert ist folgendes:  Mein Frame mit der Tabelle schließen und einen Klick auf den Button anfragiTabelle simulieren, um das Frame erneut zu erstellen

dispose();
Anfragi.anfragiTabelle.doClick();


----------



## Michael... (14. Sep 2010)

Sofern Du removeRow von DefaultTableModel nicht überschrieben hast, sollte dies die JTable automatisch aktualisieren.


----------



## Kim (14. Sep 2010)

nein, wurde nicht überschrieben.


----------



## SlaterB (14. Sep 2010)

hat die Fehlermeldung einen längeren StackTrace, ich welcher Klasse, in welche Methode tritt der Fehler auf?
Quellcode bis hin zu einem lauffähigen Mini-Beispiel würde helfen,

im Moment kann man vermuten, dass du Änderungen an einem Model durchführst, welches nicht wirklich für eine Table geeignet ist
(z.B. zu wenig ColumnClasses gegenüber Column-Anzahl)


----------



## Michael... (14. Sep 2010)

Ein kurzes Code Bsp. wäre nicht schlecht, denn normalerweise funktioniert die Aktualisierung nach removeRow.


----------



## Kim (14. Sep 2010)

Fehlermeldung:

```
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 3 >= 3
	at java.util.Vector.elementAt(Vector.java:427)
	at javax.swing.table.DefaultTableModel.getValueAt(DefaultTableModel.java:632)
	at javax.swing.JTable.getValueAt(JTable.java:2686)
	at javax.swing.JTable.prepareRenderer(JTable.java:5703)
	at com.birosoft.liquid.LiquidTableUI.paintCell(LiquidTableUI.java:298)
	at com.birosoft.liquid.LiquidTableUI.paintCells(LiquidTableUI.java:190)
	at com.birosoft.liquid.LiquidTableUI.paint(LiquidTableUI.java:101)
	at javax.swing.plaf.ComponentUI.update(ComponentUI.java:143)
	at javax.swing.JComponent.paintComponent(JComponent.java:752)
	at javax.swing.JComponent.paint(JComponent.java:1029)
	at javax.swing.JComponent.paintToOffscreen(JComponent.java:5124)
	at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:278)
	at javax.swing.RepaintManager.paint(RepaintManager.java:1224)
	at javax.swing.JComponent._paintImmediately(JComponent.java:5072)
	at javax.swing.JComponent.paintImmediately(JComponent.java:4882)
	at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:785)
	at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:713)
	at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:693)
	at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:125)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 3 >= 3
	at java.util.Vector.elementAt(Vector.java:427)
	at javax.swing.table.DefaultTableModel.getValueAt(DefaultTableModel.java:632)
	at javax.swing.JTable.getValueAt(JTable.java:2686)
	at javax.swing.JTable.prepareRenderer(JTable.java:5703)
	at com.birosoft.liquid.LiquidTableUI.paintCell(LiquidTableUI.java:298)
	at com.birosoft.liquid.LiquidTableUI.paintCells(LiquidTableUI.java:190)
	at com.birosoft.liquid.LiquidTableUI.paint(LiquidTableUI.java:101)
	at javax.swing.plaf.ComponentUI.update(ComponentUI.java:143)
	at javax.swing.JComponent.paintComponent(JComponent.java:752)
	at javax.swing.JComponent.paint(JComponent.java:1029)
	at javax.swing.JComponent.paintChildren(JComponent.java:862)
	at javax.swing.JComponent.paint(JComponent.java:1038)
	at javax.swing.JViewport.paint(JViewport.java:747)
	at javax.swing.JComponent.paintChildren(JComponent.java:862)
	at javax.swing.JComponent.paint(JComponent.java:1038)
	at javax.swing.JComponent.paintChildren(JComponent.java:862)
	at javax.swing.JComponent.paint(JComponent.java:1038)
	at javax.swing.JComponent.paintChildren(JComponent.java:862)
	at javax.swing.JComponent.paint(JComponent.java:1038)
	at javax.swing.JComponent.paintChildren(JComponent.java:862)
	at javax.swing.JComponent.paint(JComponent.java:1038)
	at javax.swing.JLayeredPane.paint(JLayeredPane.java:567)
	at javax.swing.JComponent.paintChildren(JComponent.java:862)
	at javax.swing.JComponent.paint(JComponent.java:1038)
	at javax.swing.JComponent.paintToOffscreen(JComponent.java:5124)
	at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:278)
	at javax.swing.RepaintManager.paint(RepaintManager.java:1224)
	at javax.swing.JComponent._paintImmediately(JComponent.java:5072)
	at javax.swing.JComponent.paintImmediately(JComponent.java:4882)
	at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:785)
	at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:713)
	at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:693)
	at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:125)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
```


Mein angepasstes bsp:   besser gings auf die schnelle nicht.


```
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import java.sql.SQLException;

import java.util.List;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.RowFilter;

import javax.swing.table.DefaultTableModel;

public class Overview extends JFrame {

	public static List<RowFilter<Object, Object>> filters;
	JRadioButton allAnfrRadio;
	JRadioButton openAnfrRadio;
	private static final long serialVersionUID = 1L;
	public static RowFilter<Object, Object> filter;
	public static String[][] benutzer;
	public static int anzZeilen = 4;

	public Overview() throws SQLException {

		setSize(925, 555);
		setMinimumSize(new Dimension(925, 300));
		setTitle("Übersichtstabelle aller Anfragen");

		// benötigte Panels werden erstellt & benötigte Constraints
		// haupt
		final JPanel mainPane = new JPanel(new GridBagLayout());
		// TOP
		JPanel top1 = new JPanel(new GridBagLayout());
		GridBagConstraints top1Con = new GridBagConstraints();

		JPanel top2 = new JPanel(new GridBagLayout());
		GridBagConstraints top2Con = new GridBagConstraints();

		JPanel top3 = new JPanel(new GridBagLayout());
		GridBagConstraints top3Con = new GridBagConstraints();

		JPanel top4 = new JPanel(new GridBagLayout());
		GridBagConstraints top4Con = new GridBagConstraints();

		// benötigte Buttons werden erstellt

		JButton ausDel = new JButton("Auswahl löschen");
		top3.add(ausDel);

		GridBagConstraints midCon = new GridBagConstraints();
		midCon.gridx = 0;
		midCon.gridy = 1;
		midCon.gridwidth = 4;
		midCon.weighty = 1;
		midCon.weightx = 1;
		midCon.anchor = GridBagConstraints.NORTHWEST;
		midCon.fill = GridBagConstraints.BOTH;

		final JTable tabelle = new JTable(getModel());
		JScrollPane scrollPane = new JScrollPane(tabelle);
		tabelle.setFillsViewportHeight(true);
		mainPane.add(scrollPane, midCon);

		mainPane.add(top1, top1Con);
		mainPane.add(top2, top2Con);
		mainPane.add(top3, top3Con);
		mainPane.add(top4, top4Con);
		getContentPane().add(mainPane);
		pack();

		ausDel.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				anzZeilen--;
				try {
					System.out.println("asdas");
					getModel().removeRow(0);
					tabelle.setModel(getModel());

				} catch (SQLException e1) {

					e1.printStackTrace();
				}

			}
		});

	}

	public DefaultTableModel getModel() throws SQLException {

		DefaultTableModel model;

		Vector<String> columnNames = new Vector<String>();
		columnNames.addElement("AnfID");
		columnNames.addElement("Klient");
		columnNames.addElement("Problem");
		columnNames.addElement("Eingang");
		columnNames.addElement("Bearbeiter");
		columnNames.addElement("Lösung");
		columnNames.addElement("Abschluss");

		Vector<Vector<Object>> data = new Vector<Vector<Object>>();
		Vector<Object> c;

		for (int i = 0; i < anzZeilen; i++) {
			c = new Vector<Object>();
			c.add("Spalte1_Zeile" + i);
			c.add("Spalte2_Zeile" + i);
			c.add("Spalte3_Zeile" + i);
			c.add("Spalte4_Zeile" + i);
			c.add("Spalte5_Zeile" + i);
			c.add("Spalte6_Zeile" + i);
			c.add("Spalte7_Zeile" + i);
			data.addElement(c);
		}

		model = new DefaultTableModel(data, columnNames) {

			private static final long serialVersionUID = 1L;

			// Standard Methode wird überschrieben, sodass die Zellen nicht mehr
			// Editierbar sind
			@Override
			public boolean isCellEditable(int row, int column) {
				return false;
			}

		};

		return model;

	}

	public static void main(String[] args) throws SQLException {
		Overview b = new Overview();
		b.setVisible(true);
	}

}
```



Das klappt solange mehr als 1 Zeile vorhanden ist. dann kommt:


```
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0 >= 0
	at java.util.Vector.removeElementAt(Unknown Source)
	at javax.swing.table.DefaultTableModel.removeRow(Unknown Source)
	at Overview$1.actionPerformed(Overview.java:98)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
```


----------



## SlaterB (14. Sep 2010)

im geposteten Code tritt 

```
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 3 >= 3
	at java.util.Vector.elementAt(Vector.java:427)
```
nicht auf, richtig?

getModel() erstellt bei jedem Aufruf ein neues Model, 
wenn du in unterschiedlichen Objekten Daten änderst, sind die anderen Objekte nicht betroffen,

durch anzZeilen wird das neue Model dennoch kleiner, 
es reicht also vorerst anzZeilen zu verringern und der JTable ein neues Model zuzuweisen, ohne removeRow()-Aufruf

besser aber nur einmal initial ein Model erstellen (statt immer wieder neu), und darin dann removeRow(),
dann hat anzZeilen nach der ersten Model-Erstellung keine Bedeutung mehr

-----
zu

```
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 3 >= 3
	at java.util.Vector.elementAt(Vector.java:427)
```
würde ich nun deuten, dass beim Zeichnen weniger Zeilen/Rows vorhanden sind als zum Anfang des Zeichnens gedacht,
das kann evtl. passieren, wenn das remove/setModel() mittem im Zeichenvorgang stattfindet, von einem anderen Thread aus,
verwendest du verschiedene Threads?


----------



## Kim (15. Sep 2010)

SlaterB hat gesagt.:


> im geposteten Code tritt
> 
> ```
> Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 3 >= 3
> ...


Richtig.


SlaterB hat gesagt.:


> getModel() erstellt bei jedem Aufruf ein neues Model,
> wenn du in unterschiedlichen Objekten Daten änderst, sind die anderen Objekte nicht betroffen,
> 
> durch anzZeilen wird das neue Model dennoch kleiner,
> es reicht also vorerst anzZeilen zu verringern und der JTable ein neues Model zuzuweisen, ohne removeRow()-Aufruf


Wenn ich so darüber nachdenke, wirds mir wohl klar, mein Model wird kleiner, da ich in der Datenbank den Datensatz lösche und dann ein neues Model erstelle. ich bräuchte also kein removeRow() mehr.




SlaterB hat gesagt.:


> zu
> 
> ```
> Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 3 >= 3
> ...



verschiedene Threads?, ich weiß ehrlich gesagt nichtmal was das ist :/
denke aber auch, dass es irgendwie damit zusammenhängt, weil ich eine Methode getModel() habe.
werde dies mal ändern

danke schonmal für eure Hilfe


----------



## SlaterB (15. Sep 2010)

tja, beim zweiten Teil hat ich mich auch schwer, nur mit Änderungen in Listenern usw. kann ich mir kaum ausmalen, wie es zu diesem Fehler kommt, 
außer noch dass 
> Vector<Vector<Object>> data
unterschiedlich lange Zeilen enthält, aber wie soll das passieren in einem Code der den obigen einigermaßen ähnelt?
da musst du doch mehr posten


----------



## Kim (15. Sep 2010)

Hey, also wenn ich:

[Java]DefaultTableModel meinModel = getModel();[/code]

mache,und natürlich dann meinModel verwende, funktioniert es ohne probleme


----------

