Java JTable渲染器慢吗?

Java JTable渲染器慢吗?,java,performance,swing,jtable,tablecellrenderer,Java,Performance,Swing,Jtable,Tablecellrenderer,当我使用JTable自定义渲染器和编辑器将jpanel添加到表的单元格中时,我注意到渲染速度变慢,在上下滚动时,JTable导航变得不可能。。 正如您将在下面看到的,my renderer类包含一个对象TransactionUnit(jpanel),每次调用GetTableCellRenderComponent()时,它都会将一个事务传递给TransactionUnit面板,该面板将用该事务的数据填充字段并将自身返回到渲染器 我的渲染器类: package gui.transaction; i

当我使用JTable自定义渲染器和编辑器将jpanel添加到表的单元格中时,我注意到渲染速度变慢,在上下滚动时,JTable导航变得不可能。。 正如您将在下面看到的,my renderer类包含一个对象TransactionUnit(jpanel),每次调用GetTableCellRenderComponent()时,它都会将一个事务传递给TransactionUnit面板,该面板将用该事务的数据填充字段并将自身返回到渲染器

我的渲染器类:

package gui.transaction;

import baseclasses.Transaction;
import java.awt.Component;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;


public class RegistreRenderer implements TableCellRenderer{

TransactionUnit t;
public RegistreRenderer(){
    t = new TransactionUnit(null);
}

@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean     isSelected, boolean hasFocus, int row, int column) {
    return t.getComponent((Transaction) value);
}

}
方法getComponent(事务t)返回带有事务数据的jpanel

我的编辑课:

package gui.transaction;

import baseclasses.Transaction;
import java.awt.Component;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.AbstractCellEditor;
import javax.swing.JTable;
import javax.swing.table.TableCellEditor;

public class RegistreEditor extends AbstractCellEditor implements TableCellEditor, ItemListener {

TransactionUnit t;
public RegistreEditor(){
t = new TransactionUnit(null);
}


@Override
public Object getCellEditorValue() {
   return null;
}



@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
    if(isSelected) {

        return t.getComponent((Transaction) value);
    }
    else {
        return null;
    }
}

}
我的表格模型类:

public class Model extends AbstractTableModel{


    @Override
    public int getRowCount() {
       return list.size();
    }

    @Override
    public int getColumnCount() {
       return 1;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        return list.get(rowIndex);
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        return TransactionUnit.class;
    }

    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
       list.insertElementAt((Transaction) aValue, rowIndex);
       fireTableCellUpdated(rowIndex, columnIndex);
    }

    @Override
    public String getColumnName(int column) {
        return "Registre";
    }

    public void supprimer(Transaction unit){
        list.remove(unit);
        fireTableDataChanged();
    }
    public void ajouter(Transaction unit){
        list.add(unit);
        fireTableDataChanged();
    }
    public void vider(){
        list.clear();
        fireTableDataChanged();
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return true;
    }

    public void setList(Vector<Transaction> l){
        list = l;
    }

}
公共类模型扩展了AbstractTableModel{
@凌驾
public int getRowCount(){
返回list.size();
}
@凌驾
public int getColumnCount(){
返回1;
}
@凌驾
公共对象getValueAt(int行索引、int列索引){
返回列表.get(rowIndex);
}
@凌驾
公共类getColumnClass(int columnIndex){
返回TransactionUnit.class;
}
@凌驾
public void setValueAt(对象有效、int行索引、int列索引){
list.insertElementAt((事务)aValue,rowIndex);
fireTableCellUpdated(行索引、列索引);
}
@凌驾
公共字符串getColumnName(int列){
返回“注册表”;
}
公共作废供应商(交易单位){
列表。删除(单位);
fireTableDataChanged();
}
公共部门(交易单位){
列表。添加(单位);
fireTableDataChanged();
}
公共视频{
list.clear();
fireTableDataChanged();
}
@凌驾
公共布尔值isCellEditable(int-rowIndex、int-columnIndex){
返回true;
}
公共无效集合列表(向量l){
列表=l;
}
}
with list=事务列表


所以,我在寻求帮助,我希望我能找到:),我尝试了很多解决方案,就像我使用了面板列表而不是事务列表一样,jtable变得平滑,但程序占用了大量内存,我遇到了>100行的表的内存泄漏…

您的代码片段没有显示出可能出现的错误(最有可能是在transactionUnit.getComponent()中,最好显示一个演示问题的SSCCE。此外,还有一些错误,可能与问题无关。a)编辑器实现无效(未能通知其侦听器)b)tableModel实现看起来很可疑:getClass在存储事务时返回TransactionUnit.class c)在更改模型时总是触发最合适的事件(在setValue上更新,在add上插入…)多亏了您的建议,我已经修复了模型问题。正如您提到的transactionUnit.getComponent()方法导致了这个问题,我已经解决了:),非常感谢您,如果您认为它可以帮助其他人的话。