Tabelle während Funktionsaufruf aktualisieren

xadoX

Aktives Mitglied
Hey Leute,

hab folgendes Problem:

Hab ne Tabelle (jTableÜbertragung) mit nem selbsterstellten TableModel (ArtikelÜbertragungTableModel aütm)
In einer Funktion der Klasse Verwaltung rufe ich mehrfach die Funktion

Java:
public void setNewStatus(Artikel art, boolean err) {
        int index = aütm.getIndexOfArticle(art);
        if (err){
            aütm.setError(true, index);
            jTableÜbertragung.setValueAt(error, index, 4);
        } else {
            aütm.setError(false, index);
            jTableÜbertragung.setValueAt(haken, index, 4);
        }
        jTableÜbertragung.repaint();
    }

auf. Diese Funktion fügt der jTableÜbertragung beim jeweiligen index einen neuen Wert hinzu.
Diese Werte werden aber nicht sofort aktualisiert (also nacheinander), sondern erst dann, wenn die Funktion aus der Klasse Verwaltung beendet ist.

Wie ist es also möglich, dass die Werte der Tabelle nach und nach aktualisiert werden und man dies auch sofort in der Tabelle sieht?
 
In dem Du die Methode in einem separaten Thread ausführst (s. Threads, SwingWorker...)

Bei sauberer Implementiertung des Models, sollte ein repaint() auf die JTable nicht notwendig sein.
Erbt Dein Model direkt oder indirekt von AbstractTableModel? Dann besitzt es z.B. die Methode fireTableCellUpdated(...)
 
Mein Model erbt vom AbstractTableModel. fireTableCellUpdated wird stets in der Methode aufgerufen.

Java:
public void setError(boolean error, int i) {
        if (error==true){
            liste.get(i).setError(2);
        } else liste.get(i).setError(1);
        fireTableCellUpdated(i, 4);
    }

Ich habs schon mit invokeLater probiert, aber das hat nicht geklappt.

Hier mal die Funktion aus der Klasse Verwaltung

Java:
EbayArtikelToItemType transformer = new EbayArtikelToItemType();
        ItemType item = new ItemType();
        VerifyAddItemCall api = new VerifyAddItemCall(Konfiguration.apiContext);
        api.setSite(SiteCodeType.GERMANY);
        int index;
        for(int i=0; i<ebay_liste.size(); i++){
            EbayArtikel ebayartikel = ebay_liste.get(i);
            try{
                item = transformer.transferEbayArtikelToItemType(ebayartikel);
                api.setItem(item);
                FeesType fees = api.verifyAddItem();
                index = gui.getAütm().getIndexOfArticle(ebayartikel);
                double listingFee = eBayUtil.findFeeByName(fees.getFee(), "ListingFee").getFee().getValue();
                gui.getAütm().getArtikelAtIndex(index).setGebühr(listingFee);
                gui.setNewStatus(ebayartikel, false);
            } catch (Exception e) {
                gui.setNewStatus(ebayartikel, true);
                errors.append(item.getTitle()).append("<html><br><//html>");
                errors.append(api.getApiException().getErrors().toString()).append("<html><br><//html>");
            }
        }
        return errors.toString();

Muss ich dann jeden Aufruf von gui.setNewStatus in einen neuen Thread verpacken?
Wenn ja, wie?
 
Habs jetzt genauso umgesetzt.
Leider werden die Haken immer noch nicht nacheinander gesetzt, sondern alle gleichzeitig ganz am Ende.
 
Hatte die for-Schleife in dem letzten Code Posting nicht gesehen.
Wenn's darum geht, muss natürlich diese Schleife oder die gesamte Methode in der run() des Threads laufen.
 
Ok, hab die Methode verifyItems jetzt in einem Thread gestartet und dann funktioniert es.

Wie bekomme ich es aber hin, dass ich die Tabelle wieder zurücksetze und dies dann auch aktualisiert wird?
Wenn ich einfach nur aütm.resetError aufrufe bleiben die Haken vorhanden.
 
Zuletzt bearbeitet:
Hier mal der Code vom Button

Java:
private void jButtonSendenActionPerformed(java.awt.event.ActionEvent evt) {                                              
        aütm.resetError();
        errors = null;
        jButtonFehlermeldungen.setEnabled(false);
        final ArrayList<Artikel> transmittingItems = aütm.getSelectedItems();
        if(jRadioButtonArtikelHochladen.isSelected()){
            Konfiguration.setProductionKonfiguration();
            new Thread(new Runnable(){
                public void run() {
                    errors = verwaltung.transmitItems(transmittingItems);
                }
            }).start();
        } else if(jRadioButtonVerifizieren.isSelected()){
            Konfiguration.setSandBoxKonfiguration();
            new Thread(new Runnable(){
                public void run() {
                    errors = verwaltung.verifyItems(transmittingItems);
                }
            }).start();

        } else {
            Konfiguration.setSandBoxKonfiguration();                
            new Thread(new Runnable(){
                public void run() {
                    errors = verwaltung.transmitItems(transmittingItems);
                }
            }).start();
        }
        jButtonFehlermeldungen.setEnabled(true);
    }
 
Java:
public void resetError() {
        for(int i=0; i<liste.size();i++){
            liste.get(i).setError(0);
            fireTableCellUpdated(i,5);
        }        
    }

Ich ruf aber fireTableCellUpdated auf.
 
Keine Ahnung wie Dein TableModel aussieht, aber hier sagst Du die Zelle in Spalte mit Index 5 hat sich geändert. Laut dem zuvor geposteten Code ist die korrekte Spalte aber die Nr 4
 

Neue Themen


Zurück
Oben