JTable aktualisieren
-
Sorry das ich nochmal stören muss,
aber ich habe mir eine refreshMethode gebaut die erst alle Rows aus meiner Table mit:
for (int i = 0; i < DataVector.size(); i++) { MainDialog.Modell.removeRow(i); }
löscht und dann neu "bestückt". Jedoch kommt bei der Zeile oben folgende Fehlermeldung:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 4 >= 4 at java.util.Vector.removeElementAt(Unknown Source) at javax.swing.table.DefaultTableModel.removeRow(Unknown Source) at control.Cash.refreshData(Cash.java:148) at view.MainDialog.actionPerformed(MainDialog.java:205) 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.pumpOneEventForHierarchy(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)
-
Jedesmal wenn du eine Row löschst, wird die Grösse des Modelles verkleinert.
Mal angenommen wir haben 5 Rows zu Beginn.
Entferne Index 0 -> 4 bleiben
Entferne Index 1 -> 3 bleiben
Entferne Index 2 -> 2 bleiben... moment mal, es gibt nur noch Index 0 und 1Zähle nicht hoch, sondern runter.
for( int i = DataVector.size()-1; i >= 0; i-- )...
-
Meine Modelle haben meisten nur eine Kopie der Datenbais. Damit kann ich dann sowas wie du hast ausschliessen.
class FooModel externds DefaultXxModel { publuc FooModel(List daten) { this.daten = daten; this.copyDaten = createCopy(daten); } private createCopy(List daten) { return new List(daten); } public getSize() { return copyDaten.size(); } public getColumns(int row) { return copyDaten.get(row); } public update() { this.copyDaten = createCopy(this.daten); } } // ... { model = new FooModel(daten) table = new JTable(model); // ... // irgendwas mit den Daten machen for (int i=0; i<new ArrayList(daten).size(); i++) daten.remove(i); // dann Model und Tabelle aktuallisieren model.update(); table.updateUI(); }
-
Erzeuge doch einfach ein neues Model und setze dieses an der Tabelle oder feuere ein Event ab, is doch immer noch am einfachsten um eine Tabelle zu aktualisieren.
Dann brauchste auch nicht so ne umständlichen Geschichten zu hacken, mit einer Kopie der Daten etc..Am AbstractTableModel gibts ne Methode fireTableDataChanged() an der du dich orientieren kannst.
-
Also ich benutze jetzt die runterzählSchleife Funktioniert super nur jetzt habe ich die Rows gelöscht aber wie mache ich das mit den Columns ?
Ich erzeuge sie so:Modell.addColumn("Spalte1", DataVector1); Modell.addColumn("Spalte2", DataVector2);
-
table.updateUI();
Du startest auch Linux neu wenn du das Hintergrundbild des Desktop änderst, nur um sicherzugehen? (wenn ein TableModel die richtigen TableModelEvents feuert, muss man nicht das View-Delegate mittels "updateUI" ersetzen - dann aktualisiert sich die JTable selbst, automatisch und ressourcenschonend).
@AvaJ
Benutzt du das DefaultTableModel? Falls ja, benutze setColumnCount( 0 ).