JTable, setValueAt, Laufzeitproblem

Doc

Aktives Mitglied
Hallo,
ich hab eine Tabelle, die ich per Knopfdruck mit einer Schleife befülle mit:

table.setValueAt(textpane, i, 0);

Es handelt sich um ca. 200 Einträge. Das Ganze sollte schnell gehen.

Leider dauert es mehrere Sekunden bis die Schleife durchlaufen ist.
Wieso dauert das so lange? Kann man das ganze beschleunigen?
Vielleicht das Zeichnen der Tabelle verzögern und er Zeichnen wenn alle Einträge drin sind?
 
S

SlaterB

Gast
hast du irgendwelche Infos zu Besonderheiten?
sind das große Objekte, spielen Bilder mit, hast du ein eigenes Model was jeden Wert in die DB schreibt oder irgendwas interessantes ungewöhnliches?
ideal wäre wie immer ein lauffähiges Test-Programm

wenn die Zeile
> table.setValueAt(textpane, i, 0);
auskommentiert wird, dann gehts schnell, es ist sicher dass der Rest des Programms nicht die Sekunden verbraucht?
textpane ist nicht zufällig ein JTextPane?
 

Marco13

Top Contributor
200 sollte schnell gehen. Werden die Objekte auch in der Schleife erstellt, und dauert vielleicht DAS so lange? Und... das sind nicht wirklich TextPanes, oder? ???:L

EDIT: Nyäch... lahm...
 

André Uhres

Top Contributor
Hallo Doc,

du könntest versuchen, ein neues Tabelmodel zu befüllen und es erst danach an die Tabelle mit [c]table.setModel(..)[/c] zu übergeben. Möglicherweise wird das Problem aber nicht (oder nicht nur) durch das Zeichnen verursacht. Ohne Code kann man das wohl nicht beurteilen.

Gruß,
André
 

Doc

Aktives Mitglied
mir fällt grad auf, es sind TextAreas :)

Also hier die Schleife:
Java:
for(int i=0;i<200;i++){
   JTextArea textarea = new JTextArea();		
   textarea.setText("Test");
   textarea.setBackground(Color.BLUE);
   table.setValueAt(textarea, i, 2);
}

Sowohl mit JTextPanes als auch JTextAreas extrem lange Laufzeiten :-(
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Mach mal einen Texteditor auf.
Und jetzt noch einen.
Und jetzt noch einen.
Und jetzt noch einen.
Und jetzt noch einen.
(...ungefähr 200 mal...)
Und jetzt noch einen.
Und jetzt noch einen.
Und jetzt noch einen.

Jetzt weißt du, wie Java sich da fühlt :D

Mal im Ernst: Was genau willst du damit erreichen?
 

Doc

Aktives Mitglied
Da steht natürlich immer ein anderer Text drin. Und die Hintergrundfarbe variiert. Wenn ich den setValueAt-Befehl weglasse läuft es wunderbar. Liegt also wohl daran, oder nicht?
 

André Uhres

Top Contributor
versuch mal in setValueAt keine Textarea zu übergeben, sondern nur die Farbe und den Text als String oder als eigene Klasse. Im Cellrenderer können wir dann den Text als Textarea mit dem gewünschten Background darstellen. Der Vorteil ist, dass dann nur eine einzige Textarea für die ganze Spalte benötigt wird.

Gruß,
André
 

Doc

Aktives Mitglied
Ich überlege gerade ob ich die Sache nicht zu kompliziert angegangen bin.
Es geht mir eigentlich nur darum die Hintergrundfarbe der TextPanes/TextAreas zu verändern.
Der Text bleibt immer derselbe.

Ich habe nur deswegen immer neue TextPanes mit aktualisierter Hintergrundfarbe hinzugefügt, weil ich dachte nur so könnte ich die Hintergrundfarbe der TextPanes ändern.

Kann ich auch direkt ein TextPane/TextArea einer Zelle ansprechen und den Background ändern?
 
Zuletzt bearbeitet:

KrokoDiehl

Top Contributor
Moin.
Folge am besten André Uhres Vorschlag: Das Tabellenmodell sollte NUR für die Daten Zuständigkeit sein und sich nicht um die Darstellung kümmern (müssen). Dafür gibt des TableCellRenderer wo man nahezu alles beliebig darstellen kann.
 

Doc

Aktives Mitglied
Die Funktionalität hab ich ja schon, es ist nur zu langsam :-(
Kann ich nicht direkt das Textpane in der Zelle ansprechen und dessen Background ändern?
 
S

SlaterB

Gast
dort ist keins, erst wenn gezeichnet wird, wird dort eine passende Komponente temporär verwendet,
normalerweise in JLabel
 

Doc

Aktives Mitglied
Danke für eure Hilfe.
Was meinst du mit "dort ist keins". Nachdem ich einmal die Tabelle mit Textpanes gefüllt habe, sind dort doch welche angelegt, oder? Nachdem diese in der Tabelle stehen, könnte ich danach darauf zugreifen und den Background ändern? Entschuldige dass ich nochmal frage, aber das war für mich jetzt etwas missverständlich.

Anstatt Textpanes könnte ich auch Labels verwenden. Wäre da die Hintergrundfarbe einfacher einzustellen?
 
S

SlaterB

Gast
für Entschuldigungen gibt es nie einen Grund,
TextPanes oder was auch immer ist da, wenn du sie einfügst, was aber wahrscheinlich mit ein Grund für die Langsamkeit ist und es wird versucht dir das auszureden

wenn du die TextPanes drin hast, magst du sicherlich dort was ändern können, ob das aber aber auch angezeigt wird, ist eine ganz andere Frage,
denn der Standardmechanis rechnet im Leben nicht damit, dass irgendjemand ganze TextPanes speichert,

viel sinnvoller wäre, wie schon gesagt wurde, einfache kleine Objekte mit den benötigten Daten wie Color abzulegen,
auch dann ist allerdings immer noch eine individuelle Verarbeitung nötig, damit diese Information bei der Anzeige genutzt wird
(eigenen Renderer 'installieren')

> Anstatt Textpanes könnte ich auch Labels verwenden. Wäre da die Hintergrundfarbe einfacher einzustellen?
Label sind besser, wobei die Farbeinstellung fast gleich ist, und insgesamt immer noch 100x zu kompliziert (TextPane wäre 200x zu kompliziert ;) )

siehe auch
http://www.java-forum.org/awt-swing-swt/112283-jtable-zellen-farbe.html
 

Doc

Aktives Mitglied
Der scheint wohl dasselbe Problem zu haben.

Bin leider auch nicht mit den Renderern vertraut.

Hab noch ne kleine Frage zu JTables, und will kein neues Thema dazu aufmachen:
Wenn ich aus einer Zelle den Text aus einer Textpane/TextArea auslesen will, wie bekommm ich das hin?

Mit
table.getValueAt(i,j).toString();
bekomm ich das gesamte Objekt als String.
und
table.getValueAt(i,j).getText();
kompiliert nichtmal :-(
 
S

SlaterB

Gast
weil getValueAt(i,j) Object liefern, das musst du erst auf den richtigen Typ casten, falls du weißt was dieses Wort bedeutet,
Java-Grundlagen wären nützlich vor so komplizierten Dingen wie graphischen Oberflächen mit Unmengen beteiligter Klassen, Zeichenvorgängen mit Renderern usw.
 
Zuletzt bearbeitet von einem Moderator:

Doc

Aktives Mitglied
Casten kenne ich natürlich, aber bisher nur mit ints und strings usw.

wie man ein TextPane castet weiss ich leider nicht
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Ich glaube, da gibt es ein etwas grundsätzlicheres Verständnisproblem....

MagrittePipe.jpg


Dort steht: "Das ist keine Pfeife".

Natürlich IST das keine Pfeife. Das ist ein Bild von einer Pfeife.

Und eine JTable IST keine Tabelle. Das ist nur das, womit eine Tabelle auf dem Bildschirm dargestellt wird.

Der Unterschied ist wirklich wichtig. Im abstraktesten Sinn IST eine "Tabelle" nur eine Ansammlung von Daten, auf die irgendwie zugegriffen werden kann. Nämlich sinngemäß in der Form
Object daten = tabelle.gibMirDieDaten(zeile, spalte);
Zusätzlich hat so eine Tabelle noch weitere Eigenschaften und Funktionen. Insgesamt ergeben die das "geistige Modell dessen, was wir als "Tabelle" bezeichnen. Und zusammengefasst ist dieses abstrakte Modell einer Tabelle im interface TableModel.

Oder kurz: Jedes "Ding", das die Funktionen anbietet, die in diesem Interface zusammengestellt sind, ist etwas, was man als "Tabelle" bezeichnen kann.

Wenn in der Tabelle sowas steht wie
Code:
Joe | 23 | Lesen
Tim | 45 | Schwimmen
Tom | 12 | Schreiben
Tum | 55 | Laufen
dann haben diese Einträge aber keine "Hintergrundfarbe", da stehen nur irgendwelche Namen und Zahlen.

Erst, wenn man diese Tabelle mit einer JTable auf den Bildschirm bringt, macht es Sinn, von Farben, Schriftarten und dem ganzen anderen Schmodder zu reden.

Wenn du eine Tabelle erstellst, bei der die Einträge durch JLabels dargestellt werden sollen, dann heißt das nicht, dass IN der Tabelle JLabels enthalten sind. Es macht also keinen Sinn, [c]setValueAt(someLabel,r,c)[/c] aufzurufen. Es sollte immer nur [c]setValueAt(theValueThatShouldBeDisplayedInTheLabel,r,c)[/c] sein.

Wenn es dann um Hintergrundfarben und so geht, ist das nur eine Anweisung an die JTable, WIE sie den Inhalt des TableModels darstellen soll. Und das beschreibt man mit einen CellRenderer.

Vielleicht noch zur Klärung: Der CellRenderer IST ein Label, aber es gibt üblicherweise für die ganze Tabelle nur EINEN CellRenderer - also nur EIN Label. Es wird immer dasSELBE Label verwendet, um die unterschiedlichen Tabelleninhalte zu zeichnen.

Also: Was soll in die Tabelle rein? Einfach nur Text? JTextAreas jedenfalls nicht...
 

Doc

Aktives Mitglied
Danke dir. Das hat etwas geholfen. In die Tabelle soll nur Text, das stimmt.
Ändern möchte ich nur die Hintergrundfarbe. Hab schon im Internet danach gesucht, aber irgendwie steig ich nicht ganz durch, wie ich das mit einem Cellrenderer bewerkstelligen kann.
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Java:
import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;


public class SimpleTableDemo2 extends JPanel {
    private boolean DEBUG = false;

    public SimpleTableDemo2() {
        super(new GridLayout(1,0));

        final JTable table = createTable();
        table.setDefaultRenderer(Object.class, new ColorRenderer());
        add(new JScrollPane(table));
    }

    class ColorRenderer extends DefaultTableCellRenderer
    {
        public ColorRenderer()
        {
            setOpaque(true);
        }

        public Component getTableCellRendererComponent(
                                JTable table, Object object,
                                boolean isSelected, boolean hasFocus,
                                int row, int column)
        {
            super.getTableCellRendererComponent(table, object, isSelected, hasFocus, row, column);
            if (row == 1)
            {
                setBackground(Color.RED);
            }
            else
            {
                setBackground(Color.GREEN);
            }
            return this;
        }
    }


    private JTable createTable()
    {
        String[] columnNames =
            {"First Name", "Last Name", "Sport", "# of Years", "Vegetarian"};

        Object[][] data = {
            {"Kathy", "Smith", "Snowboarding", new Integer(5), new Boolean(false)},
            {"John", "Doe", "Rowing", new Integer(3), new Boolean(true)},
            {"Sue", "Black","Knitting", new Integer(2), new Boolean(false)},
            {"Jane", "White","Speed reading", new Integer(20), new Boolean(true)},
            {"Joe", "Brown","Pool", new Integer(10), new Boolean(false)}
        };
        return new JTable(data, columnNames);
    }

    private static void createAndShowGUI() {
        JFrame frame = new JFrame("SimpleTableDemo2");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        SimpleTableDemo2 newContentPane = new SimpleTableDemo2();
        newContentPane.setOpaque(true); //content panes must be opaque
        frame.setContentPane(newContentPane);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G JTable setValueAt und getValueAt übergeben columnIndex nicht AWT, Swing, JavaFX & SWT 6
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
S HPRO und UPRO gemeinsame JTABLE gemeinsamer RENDERER ? AWT, Swing, JavaFX & SWT 1
F Swing JTable - MultiHeader inkl. Eingabemöglichkeit AWT, Swing, JavaFX & SWT 1
S JTable - Feldinhalte anzeigen AWT, Swing, JavaFX & SWT 15
D Swing JTable Spaltenbreite AWT, Swing, JavaFX & SWT 1
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
G jTable - getSelectedRow() AWT, Swing, JavaFX & SWT 3
I JTable mit einem Button zu einer Detail Seite springen AWT, Swing, JavaFX & SWT 4
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2
D Tastaturabfragen CTRL+t, CTRL+E bei eine JTable, bestehend aus JTextAteas AWT, Swing, JavaFX & SWT 4
P Checkboxes in JTable nicht editable AWT, Swing, JavaFX & SWT 9
F Best-Practise: JTable Text in Zelle zu groß AWT, Swing, JavaFX & SWT 2
izoards JTable in CSV File schreiben... AWT, Swing, JavaFX & SWT 23
Kohl Jedes Objekt einer JTable um ein Zeichen verkürzen AWT, Swing, JavaFX & SWT 7
I JTable, DefaultTableModel, zwei Zahlen multiplizieren. AWT, Swing, JavaFX & SWT 26
M JTABLE / wie oft wurde gewürfelt. AWT, Swing, JavaFX & SWT 1
F JTable vergrößern AWT, Swing, JavaFX & SWT 2
H JTable: Diverse NullPointer-Exceptions zur Laufzeit AWT, Swing, JavaFX & SWT 3
J Swing Werte des JTable werden nicht angezeigt AWT, Swing, JavaFX & SWT 9
T Swing JTable cellRenderer mit jpg Hintergrundfarbe lässt sich nicht ändern. AWT, Swing, JavaFX & SWT 1
HoT Einzelne Zelle in JTable Rahmen unten setzen AWT, Swing, JavaFX & SWT 24
B JTable Zellen zusammenfügen AWT, Swing, JavaFX & SWT 3
M Swing Cell Renderer für Zeilenumbruch in JTable AWT, Swing, JavaFX & SWT 0
H JTable im JSplitPane darstellen AWT, Swing, JavaFX & SWT 2
MadMax2506 Swing JTable lädt sehr lange AWT, Swing, JavaFX & SWT 1
D Zeilenumbruch in einer JTable AWT, Swing, JavaFX & SWT 9
R Swing JTable und Spaltenausrichtung AWT, Swing, JavaFX & SWT 8
G JTable füllen AWT, Swing, JavaFX & SWT 1
H JTable TableCellEditor-Problem AWT, Swing, JavaFX & SWT 0
W Swing JTable Zeilenumbruch innerhalb einer Zelle AWT, Swing, JavaFX & SWT 3
J Datensatz in jTable ausgeben AWT, Swing, JavaFX & SWT 3
M Swing Automatischer Editorstart in JTable-Zelle AWT, Swing, JavaFX & SWT 5
ralfb1105 Swing JTable aktualisieren AWT, Swing, JavaFX & SWT 5
adiko01 JTable: Nur markierte Zeilen aus der Tabelle in CSV exportiern AWT, Swing, JavaFX & SWT 9
M JTable.setDefaultRenderer(...) greift nicht AWT, Swing, JavaFX & SWT 0
J JTable: Eingabe in Tabellenzelle korrigieren AWT, Swing, JavaFX & SWT 4
T Problem mit JTable Sortierung AWT, Swing, JavaFX & SWT 2
D JTable nach INSERT aktualisieren /refreshen AWT, Swing, JavaFX & SWT 1
D MySQL Daten in JTable anzeigen AWT, Swing, JavaFX & SWT 2
H Swing Jtable extra spalte AWT, Swing, JavaFX & SWT 6
S Swing Rechteck über JTable zeichnen (per MouseListener) AWT, Swing, JavaFX & SWT 1
S Swing Mal wieder JTable Ansicht aktualisieren AWT, Swing, JavaFX & SWT 10
A JTable mit Daten füllen AWT, Swing, JavaFX & SWT 1
VfL_Freak Swing Einzelne Zeile in jTable selektieren klappt nicht AWT, Swing, JavaFX & SWT 7
N AWT jTable CellRenderer AWT, Swing, JavaFX & SWT 6
T Swing JTable valueChanged datensatz löschen AWT, Swing, JavaFX & SWT 1
0 Swing JTable aus anderer Klasse updaten AWT, Swing, JavaFX & SWT 5
S Jtable defaultRenderer wohin damit ? AWT, Swing, JavaFX & SWT 23
T Swing JTable / FocusListener AWT, Swing, JavaFX & SWT 0
it_is_all Warum wird die JTable im JDialog nicht angezeigt? AWT, Swing, JavaFX & SWT 1
L Swing JTable im Panel darstellen AWT, Swing, JavaFX & SWT 8
T Swing Double Click bei Buttons in JTable AWT, Swing, JavaFX & SWT 9
J addRow bei JTable AWT, Swing, JavaFX & SWT 6
M Jtable gibt -1 wert bei selectedRow und Column AWT, Swing, JavaFX & SWT 3
Meeresgott Swing JTable AWT, Swing, JavaFX & SWT 4
J JTable Selection Listener funktioniert nicht AWT, Swing, JavaFX & SWT 4
C Swing Daten in JTable wiedergeben per TableModel und MVC Pattern AWT, Swing, JavaFX & SWT 16
Z Swing Drag&Drop zwischen JTable und JTree AWT, Swing, JavaFX & SWT 4
Thallius JTable dynamisch Spaltenanzahl verändern AWT, Swing, JavaFX & SWT 2
Thallius JTable dynamisch laden? AWT, Swing, JavaFX & SWT 2
B Swing JTable sortieren AWT, Swing, JavaFX & SWT 2
T Swing JTable auslesen und befüllen AWT, Swing, JavaFX & SWT 8
B JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 1
J JTable und Suchlogik AWT, Swing, JavaFX & SWT 4
Viktim Swing JTable mit Tab verlassen AWT, Swing, JavaFX & SWT 1
F Swing Spaltenbreite einer Column eines JTable auslesen AWT, Swing, JavaFX & SWT 5
Viktim Swing JTable Mit Tab druch Zeilen Wechseln AWT, Swing, JavaFX & SWT 5
Thallius Warum refrehsed mein JTable nicht? AWT, Swing, JavaFX & SWT 5
Ghostman1711 Hinzufügen ausgewählter Dateinen des Filechoosers zu einem JTable AWT, Swing, JavaFX & SWT 9
S Swing JTable - Einzelne Rows einfärben AWT, Swing, JavaFX & SWT 11
M Wert einer Zelle aus JTable ziehen AWT, Swing, JavaFX & SWT 4
K JTable getValueAt() klappt nicht immer AWT, Swing, JavaFX & SWT 1
K JTable in extra Klasse, Zugriff in einer anderen klasse nicht möglich AWT, Swing, JavaFX & SWT 26
B Swing Tabelle(JTable) filtern swing GUI AWT, Swing, JavaFX & SWT 3
P JTable - bei Eingabe Selektion AWT, Swing, JavaFX & SWT 0
P Fokus auf Zelle in JTable AWT, Swing, JavaFX & SWT 1
S Swing Deselektion in JTable verhindern AWT, Swing, JavaFX & SWT 0
D Problem mit JTable AWT, Swing, JavaFX & SWT 1
N Swing Print JTable mit AbstractTableModel AWT, Swing, JavaFX & SWT 1
Ananaskirsche Swing jTable Reihen zuviel eingefügt AWT, Swing, JavaFX & SWT 12
P im JTable die Schriftfarbe ändern AWT, Swing, JavaFX & SWT 19
T Swing JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 4
S Dreiecke in bestimmte Zellen einer JTable AWT, Swing, JavaFX & SWT 9
LexeB4F Zelle in JTable gezielt einfärben AWT, Swing, JavaFX & SWT 4
LexeB4F JTable mehrere Zelle selektieren und inhalte Löschen.. Ideen gesucht AWT, Swing, JavaFX & SWT 1
D Swing JTable Renderer Grafikfehler AWT, Swing, JavaFX & SWT 0
K Swing JTable mit ImageIcon und Text in einer Zelle AWT, Swing, JavaFX & SWT 1
M Swing JTable GroupableHeader Background Color AWT, Swing, JavaFX & SWT 4
K Swing JTable updaten AWT, Swing, JavaFX & SWT 9
thet1983 Swing MySQL >> JTable AWT, Swing, JavaFX & SWT 5
J JTable bounds ändern durch resizing des Fensters AWT, Swing, JavaFX & SWT 9
F JTable Zellen-Hintergrund ändern AWT, Swing, JavaFX & SWT 7
O JTable linksbündig drucken (nicht der Zelleninhalt) AWT, Swing, JavaFX & SWT 2
Crazynet xls Datei in JTable AWT, Swing, JavaFX & SWT 3
O JTable ohne Rahmen printen AWT, Swing, JavaFX & SWT 3
L Swing JTable refresht die Column Namen nicht AWT, Swing, JavaFX & SWT 0
K JTable komplett durch andere ersetzen AWT, Swing, JavaFX & SWT 4
S JTable übernimmt Änderungen nicht AWT, Swing, JavaFX & SWT 2
Y JTable AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen


Oben