ERLEDIGT
NEIN
NEIN
ANTWORTEN
13
13
ZUGRIFFE
532
532
EMPFEHLEN
-
ich habe eine JTable mit (4 spalten), die tabelle wird befüllt wenn ein button gedrükt wird, dabei bewegt sich ein JPorgressbar hin und her während der tabelle befüllt wird, alles läuft gut, nur am ende bekomme ich eine Exception z.B.
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 3983 >= 3982 at java.util.Vector.elementAt(Unknown Source) at javax.swing.table.DefaultTableModel.getValueAt(Unknown Source) at javax.swing.JTable.getValueAt(Unknown Source) at javax.swing.JTable.prepareRenderer(Unknown Source) at javax.swing.plaf.basic.BasicTableUI.paintCell(Unknown Source) at javax.swing.plaf.basic.BasicTableUI.paintCells(Unknown Source) at javax.swing.plaf.basic.BasicTableUI.paint(Unknown Source) at javax.swing.plaf.ComponentUI.update(Unknown Source) at javax.swing.JComponent.paintComponent(Unknown Source) at javax.swing.JComponent.paint(Unknown Source) at javax.swing.JComponent.paintChildren(Unknown Source) at javax.swing.JComponent.paint(Unknown Source) at javax.swing.JViewport.paint(Unknown Source) at javax.swing.JComponent.paintChildren(Unknown Source) at javax.swing.JComponent.paint(Unknown Source) at javax.swing.JComponent.paintToOffscreen(Unknown Source) at javax.swing.BufferStrategyPaintManager.paint(Unknown Source) at javax.swing.RepaintManager.paint(Unknown Source) at javax.swing.JComponent._paintImmediately(Unknown Source) at javax.swing.JComponent.paintImmediately(Unknown Source) at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source) at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source) at javax.swing.RepaintManager.prePaintDirtyRegions(Unknown Source) at javax.swing.RepaintManager.access$700(Unknown Source) at javax.swing.RepaintManager$ProcessingRunnable.run(Unknown Source) at java.awt.event.InvocationEvent.dispatch(Unknown Source) at java.awt.EventQueue.dispatchEventImpl(Unknown Source) at java.awt.EventQueue.access$000(Unknown Source) at java.awt.EventQueue$1.run(Unknown Source) at java.awt.EventQueue$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.AccessControlContext$1.doIntersectionPrivilege(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)
manchmal wird die tablle nicht richtig angezeigt erst wenn ich die anwendung neustarte dann wird richtig angezeigt.
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
public void tabAnzeigen(LinkedList<Person> personList) { if (fehlerTextList != null) { int tabStrukturEntries = tableModel.getRowCount(); if(tabStrukturEntries > 0) { for (int i = tabStrukturEntries; i > 0; i--) { tableModel.removeRow(i - 1); } } for (Person entry : personList) { tableModel.addRow(new Object[] { entry.getName(), entry.getVorname(), entry.getBeruf(), entry.getWohnort() }); } } }
wenn button gedrückt wird, wird folgendes ausgeführt
hat jemand eine Idee warum taucht diese Exception auf.Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
private void tabelleAktualisieren() { int erg = JOptionPane.showConfirmDialog(this, "Wollen Sie die Tabelle aktualisieren?", "Hinweis", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE); if (erg == JOptionPane.YES_OPTION) { personList.clear(); new Thread(new Runnable() { @Override public void run() { System.out.println("START: " + getZeit()); // WAIT_CURSOR wird angezeigt wenn die Tabelle aktualisiert wird setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); progressBar.setVisible(true); progressBar.setForeground(Color.BLUE); progressBar.setBackground(Color.WHITE); progressBar.setString("Bitte warten..."); progressBar.setStringPainted(true); progressBar.setIndeterminate(true); // Person_Tabelle wird new gefüllt und angezeigt db=datenbank persontList = db.personTabFüllen(); tabAnzeigen(persontList); setCursor(Cursor.getDefaultCursor()); progressBar.setIndeterminate(false); progressBar.setVisible(false); System.out.println("ENDE: " + getZeit()); }}).start(); } }
danke im voraus
-
Ich denke es wird damit zu tun haben dass du in einem eigenen Thread versucht Swing-Komponenten zu ändern. Diese sollten aber nur im EDT geändert werden.
Du könntest hierfür einen Task verwenden.
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
private class UpdateData extends Task<Void, Void> { private List<Personen> data; /** * Konstruktor */ public UpdateData() { super(Application.getInstance()); data = new ArrayList<Personen>(); } @Override protected Void doInBackground() throws Exception { data = ... // Daten von Datenbank holen return null; } @Override protected void finished() { super.finished(); // Geholte Daten in das Model der Table schreiben } }
Die doInBackground-Methode läuft in einem eigenen Thread.
finished() läuft im EDT und wird am Ende aufgerufen.
-
was meinst du mit EDT (Hauptprogramm!)
-
-
meinst du
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
class UpdateData implements Task{ @Override public void cancel() { // TODO Auto-generated method stub } @Override public void run() { // TODO Auto-generated method stub } }
-
Ich verstehe die Frage nich so ganz.
Lies dir einfach zu Task alles durch:
.) org.jdesktop.application.Task
.) Swing Worker
.) Background Task
Dann sollte es klar sein
-
mein programmCode funktioniert einwandfrei , das problem ist wenn die Jtable befüllt ist und angezeigt wird, erst danach kommt die oben genannte Exception, und das wollte ich vermeiden?
ich benutze Eclipse
ich bekomme kein Task (org.jdesktop.application.Task)
woran kann das liegen?Geändert von javama (25.01.12 um 12:53 Uhr)
-
Wenn ein Fehler auftritt dann funktioniert der Programmcode wohl nicht einwandfrei

Ich hatte den selben Fehler wie du vor ein paar Wochen. Und bei mir war der Fehler
dass das Model der Table in einem eigenen Thread geändert wurde, und nicht im EDT.
Warum der Fehler auftritt wenn man es nicht im EDT macht weiß ich noch nicht.
Hatte noch keine Zeit mich damit zu beschäftigen.
-
ich benutze Eclipse
ich bekomme kein Task (org.jdesktop.application.Task)
woran kann das liegen?
-
Speziell wegen deinem Programm:
Du machst
Code java:1
tabAnzeigen(persontList);
in einem eigenen Thread. Ich nehme an dass du hier die Personenliste dem Model der Table.
Da der Thread aber nicht im EDT läuft wird es hier zu Schwierigkeiten kommen.
Folgender Umbau:
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
private void tabelleAktualisieren() { int erg = JOptionPane.showConfirmDialog(this, "Wollen Sie die Tabelle aktualisieren?", "Hinweis", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE); if (erg == JOptionPane.YES_OPTION) { personList.clear(); UpdateData updateData = new UpdateData(); updateData.execute(); } } private class UpdateData extends Task<Void, Void> { private List<Personen> data; /** * Konstruktor */ public UpdateData() { super(Application.getInstance()); data = new ArrayList<Personen>(); System.out.println("START: " + getZeit()); // WAIT_CURSOR wird angezeigt wenn die Tabelle aktualisiert wird setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); progressBar.setVisible(true); progressBar.setForeground(Color.BLUE); progressBar.setBackground(Color.WHITE); progressBar.setString("Bitte warten..."); progressBar.setStringPainted(true); progressBar.setIndeterminate(true); } @Override protected Void doInBackground() throws Exception { // Person_Tabelle wird new gefüllt und angezeigt db=datenbank persontList = db.personTabFüllen(); return null; } @Override protected void finished() { super.finished(); tabAnzeigen(persontList); setCursor(Cursor.getDefaultCursor()); progressBar.setIndeterminate(false); progressBar.setVisible(false); System.out.println("ENDE: " + getZeit()); } }
So sollte es ca funktionieren.(Nicht getestet)
-
-
ist das ein external jar?
deine jar-datei ist nicht ensprechbar!
-
Wie lange arbeitest du schon mit Eclipse
?
Die Jar-Datei mußt du runter laden und im Projekt über den Build-Path einbinden.
Und...du braucht das Jar nicht umbedingt. Der Task ist nur eine Art von SwingWorker.
Lies dir den SwingWorker durch(http://docs.oracle.com/javase/6/docs...ingWorker.html)Geändert von sheel (25.01.12 um 21:46 Uhr) Grund: Doppel
-
das funktioniert jetzt mit SwingWorker
protected Void doInBackground()
protected void done()
Ähnliche Themen
-
Selektion von JTable-Einträgen nicht mehr möglich und JProgressbar-Frage
Von Sacrent im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 0Letzter Beitrag: 20.05.10, 16:24 -
JTable dynamisch befüllen
Von Myar im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 4Letzter Beitrag: 14.12.07, 15:22 -
eine JTable befüllen
Von Mayday171 im Forum JavaAntworten: 1Letzter Beitrag: 30.05.07, 16:12 -
JTable und JProgressBar
Von thodtie im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 13Letzter Beitrag: 29.10.04, 10:23 -
JTable und JProgressBar
Von thodtie im Forum JavaAntworten: 3Letzter Beitrag: 28.10.04, 13:15





Zitieren
Login





