DefaultTableModel ruft paintComponent auf !

mutoki

Mitglied
Hallo,

hab im Internet schon etwas rumgesucht, aber leider nichts passendes gefunden.

Und zwar hab ich das Problem, dass die Tabelle (Klasse: DefaultTableModel) bei jedem addRow ( table.addRow(zeilenInfo) ) die paintComponent Methode für ein anderes SpliPane aufruft. Es werden zB. 10 Zeilen hinzugefügt und die paintComponent Methode wird 10 mal aufgerufen.

Sind 10 Zeilen hinzugefügt, wird die Tabelle gelöscht und es folgen wieder 10 Zeilen.
Die paintComponent Methode soll nur bei diesem Übergang (Tabelle löschen) ausgeführt werden.

Sowohl die Tabelle als auch die Animation sind in einem eigenen SplitPane.

Wie kann ich verhindern, dass die paint Methode bei jedem addRow ausgeführt wird?

vereinfachter Code für Tabelle:
Java:
DefaultTableModel table = new DefaultTableModel();
for (int i = 0; i < 10; i++){
  table.addRow(data);
}

Code um Animation anzuzeigen:
Java:
splitpane.setBottomComponent(new Animation());
clearTable();
 
grundsätzlich sollte es dir ganz egal sein, wann warum wie oft paintComponent() ausgeführt wird,
du solltes nicht den Start oder die Schritt-Weite z.B. einer Animation davon abhängig machen,
das lieber zeitlich steuern, egal ob jedes Bild 3x gemalt wird,
aber ist natürlich aufwändig

Möglichkeiten sind noch:
- die 10x addRow() in einen SwingUtilities.invokeLater()-Block setzen, bekannt?
sowieso zu empfehlen bei allen GUI-Änderungen, allerdings nur nötig wenn du einen separaten Thread hast,
wo steht der Code mit dem add(), von wo aufgerufen?
anderenfalls die paints wiederum kaum vorstellbar, also Thread?

kommen die add() wirklich direkt hintereinander in einer Schleife oder dauert es jeweils bisschen mit Berechnung?
falls in direkter Folge sollte gar nicht die Zeit sein, jeweils mit paint zu reagieren..

- DefaultTableModel selber bietet noch eine Methode, um die gesamten Daten in einem Schlag auszutauschen,
vorher separat sammeln usw.,
oder greife tiefer ins Model ein, eigene Implementierung, Methode add10Rows() mit nur einem Aufruf an die JTable am Ende,
siehe Quellcode DefaultTableModel als Vorlage
 
wo steht der Code mit dem add(), von wo aufgerufen?
anderenfalls die paints wiederum kaum vorstellbar, also Thread?

Ja die add() Anweisung steht in einer run() Methode, also Thread

kommen die add() wirklich direkt hintereinander in einer Schleife oder dauert es jeweils bisschen mit Berechnung?
falls in direkter Folge sollte gar nicht die Zeit sein, jeweils mit paint zu reagieren..

Nein du hast natürlich Recht, es wird zuerst eine Berechnung bzw. Zuweisung ausgeführt.

- DefaultTableModel selber bietet noch eine Methode, um die gesamten Daten in einem Schlag auszutauschen,
vorher separat sammeln usw.,
oder greife tiefer ins Model ein, eigene Implementierung, Methode add10Rows() mit nur einem Aufruf an die JTable am Ende,
siehe Quellcode DefaultTableModel als Vorlage

Die Zeilen alle auf einmal auszutauschen wäre zwar möglich, ist aber nicht gewünscht, da der Benutzer sehen soll, dass Zeile für Zeile hinzugefügt wird.

Es irritiert mich einfach wenn ich beim debuggen in der Konsole die Ausgaben mehrfach erhalte, obwohl ich den Code eben nur einmal aufgerufen habe. Deswegen kam ja auch die Frage auf.
 
Sobald das paintComponent egal ist, kann man ein "langsames Hinzufügen" GROB mit sowas machen wie
Java:
void addRows()
{
    Thread adder = new Thread(new Runnable())
    {
        @Override
        public void run()
        {
            Row row = readRowFromSomewhere();
            doAddRow(row);

            sleepIfDesired();
        }
    });
    adder.start();
}


private void doAddRow(final Row row)
{
    SwingUtilities.invokeLater(new Runnable())
    {
        @Override
        public void run()
        {
            tableModel.addRow(row);
        }
    });
}
 

Zurück
Oben