JTable カスタム レンダラーとエディターを使用して jpanel をテーブルのセルに追加したところ、上下にスクロールするとレンダリングが遅くなり、jtable のナビゲーションが不可能になることに気付きました. 以下に示すように、私のレンダラー クラスにはオブジェクト TransactionUnit が含まれています。 (jpanel) で、getTableCellRendererComponent() が呼び出されるたびに、TransactionUnit パネルに Transaction が渡されます。TransactionUnit パネルは、フィールドにその Transaction のデータを入力し、それ自体をレンダラーに返します。
私のレンダラークラス:
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(Transaction 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;
}
}
with list = トランザクションのリスト ...
それで、私は助けを求めています、そして私はそれを見つけることを願っています:)、トランザクションのリストの代わりにパネルのリストを使用したときのように、jtableはスムーズになりましたが、プログラムには多くの時間がかかります100行を超えるテーブルでメモリリークが発生します...