tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
13
ZUGRIFFE
532
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    javama javama ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    102
    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
    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();
                
                
            }
     
        }
    hat jemand eine Idee warum taucht diese Exception auf.
    danke im voraus
     

  2. #2
    hesk hesk ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    192
    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.
     

  3. #3
    javama javama ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    102
    was meinst du mit EDT (Hauptprogramm!)
     

  4. #4
    hesk hesk ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    192
     

  5. #5
    javama javama ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    102
    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
                                        
                                    }
                                      
                                  }
     

  6. #6
    hesk hesk ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    192
    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
     

  7. #7
    javama javama ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    102
    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)
     

  8. #8
    hesk hesk ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    192
    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.
     

  9. #9
    javama javama ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    102
    ich benutze Eclipse
    ich bekomme kein Task (org.jdesktop.application.Task)
    woran kann das liegen?
     

  10. #10
    hesk hesk ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    192
    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)
     

  11. #11
    hesk hesk ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    192
    Zitat Zitat von javama Beitrag anzeigen
    ich benutze Eclipse
    ich bekomme kein Task (org.jdesktop.application.Task)
    woran kann das liegen?
    Ist hier enthalten: appframework-1.0.3.jar
     

  12. #12
    javama javama ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    102
    ist das ein external jar?

    deine jar-datei ist nicht ensprechbar!
     

  13. #13
    hesk hesk ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    192
    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
     

  14. #14
    javama javama ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    102
    das funktioniert jetzt mit SwingWorker

    protected Void doInBackground()

    protected void done()
     

Ähnliche Themen

  1. Selektion von JTable-Einträgen nicht mehr möglich und JProgressbar-Frage
    Von Sacrent im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 0
    Letzter Beitrag: 20.05.10, 16:24
  2. JTable dynamisch befüllen
    Von Myar im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 4
    Letzter Beitrag: 14.12.07, 15:22
  3. eine JTable befüllen
    Von Mayday171 im Forum Java
    Antworten: 1
    Letzter Beitrag: 30.05.07, 16:12
  4. JTable und JProgressBar
    Von thodtie im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 13
    Letzter Beitrag: 29.10.04, 10:23
  5. JTable und JProgressBar
    Von thodtie im Forum Java
    Antworten: 3
    Letzter Beitrag: 28.10.04, 13:15