TableCellRenderer, Performance

  • Themenstarter Themenstarter sofa-surfer
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
S

sofa-surfer

Gast
Hallo,

eine Frage zum TableCellRenderer: Wie bekomme ich es hin, dass wenn ich eine eigene Implementierung des TableCellRenderer-Interfaces erzeuge, dann nicht die CPU ständig auf 100% läuft nur um meine JTable darzustelllen?
In den ganzen Tutorials die ich zu diesem Thema gelesen habe steht immer nur, dass genau das ein Problem ist, aber es steht nicht drin wie man es löst. Bzw das man es so machen soll, wie es im DefaultTableCellRenderer realisiert ist. Aber mal nen praktisches Beispiel dazu hab ich irgendwie noch nicht gefunden ....

Danke.
 
Auf eine so allgemein Frage kann keine präzise ANtwort kommen. Wir können schließlich nciht wissen was du da in deinem Renderer treibst und daher auch nciht sehen wo bei dir der Bottleneck liegt.
 
AlArenal hat gesagt.:
Auf eine so allgemein Frage kann keine präzise ANtwort kommen. Wir können schließlich nciht wissen was du da in deinem Renderer treibst und daher auch nciht sehen wo bei dir der Bottleneck liegt.

wahrscheinlich typischer fehler wie in abschnitt 4 im oben genannten link beschrieben 😉
 
Danke.

Wieso kann sowas nicht auch einfach in Tutorials stehen? ???:L
 
tja, sowas steht halt nur in guten tutorials, wie in unserem :-D
 
es kann nur besser werden...

hab meinen ganzen krams jetzt nicht hier kann und kann also kein feedback geben.
 
ich noch mal und diesmal mit code :wink:
ich habs jetzt denk ich mal so, wie es hier im Tutorial beschrieben war. aber nach wie vor das selbe problem: 100% CPU-Auslastung nur vom Darstellen. Sobald die Tabelle weg ist --> kein Problem

Die Klasse, die die Tabelle darstellt:
Code:
private JTable table;
private TreeTableCellRenderer ttcr;
private LayoutTableCellRenderer ltcr;
public AbstractClassifier classifier;

public ClassifierGUI(String label)
{
    ttcr = new TreeTableCellRenderer();
    ltcr = new LayoutTableCellRenderer();

    customizeTable();
}

Die Methode zum Tabelle konfigurieren:
Code:
private void customizeTable()
{
    table = new JTable(0, 5);
    table.setDefaultRenderer(Object.class, ltcr);
    table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
    table.setBackground(this.getBackground());
    table.setEnabled(true);
    table.setShowGrid(false);
}

Die Methode, die die Tabelle zu Laufzeit aktualisiert:
Code:
public void rebuildPanel()
{
    // create new table
    customizeTable();

    // macht erst mal diverse Sachen, die aber nicht von Interesse sind

    // generate columns
    DefaultTableColumnModel cm = new DefaultTableColumnModel();
    TableColumn col;

    col  = new TableColumn(0,name_width+20);
    col.setCellRenderer(ttcr);
    col.setResizable(true);
    cm.addColumn(col);
    col  = new TableColumn(1,size_width+20);
    col.setResizable(true);
    cm.addColumn(col);
    for (int j = 2; j<5; j++)
    {
        col  = new TableColumn(j,100);
        cm.addColumn(col);
     }
     table.setColumnModel(cm);
}

Und dann noch die beiden Renderer:
Code:
public class TreeTableCellRenderer extends JTree implements TableCellRenderer
{
    public Component getTableCellRendererComponent
        (JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        if (value != null)
        {
            if (column == 0)
            {
                 table.setRowHeight(row, this.getPreferredSize().height);
                  // und ebend alles was noch gemacht werden soll
                 return this;
            }
        }
        return null;
    }
}


public class LayoutTableCellRenderer extends JPanel implements TableCellRenderer
{
    public Component getTableCellRendererComponent
        (JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        if (value != null)
        {
            this.setLayout(new BorderLayout());
            JLabel content = new JLabel((String) value.toString());

            if (column == 1)
            {
                JPanel temp = new JPanel(new BorderLayout());
                temp.add(content, BorderLayout.EAST);
                this.add(temp, BorderLayout.NORTH);
            }

            this.add(content, BorderLayout.NORTH);
       }
        return this;
    }
}

Wo hängt es jetzt?
 
ok, ich ha jetzt den Grund gefunden:
Zeile 11 im TreeTableCellRenderer ist das Problem

Code:
table.setRowHeight(row, this.getPreferredSize().height);

Woran liegt das, bzw wie kann ich das gewünschte Ergebnis erreichen ohne meinen Rechner zu strapazieren?
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben