程序一般是3个自定义对象数组,JTable代表每个数组。我有一个自定义渲染器和tablemodel。自定义对象内部有一个对象,它是每个可视元素。
当我从1个表中删除一行并替换时,将其重新渲染为空,它会完美呈现,但是当我向表中添加一个新行时,它会正确呈现JTextField和JLabel,但会从之前的对象呈现JButton。
表格型号
public class PositionTableModel extends AbstractTableModel
{
private List<kosilkshik.Position> local;
public PositionTableModel(List<kosilkshik.Position> list)
{
local = list;
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex)
{
return true;
}
@Override
public int getRowCount(){return local.size();}
@Override
public int getColumnCount() {return 24;}
@Override
public Object getValueAt(int rowIndex, int columnIndex)
{
kosilkshik.Position pos = local.get(rowIndex);
switch (columnIndex)
{
case 0:
return pos.view.symbols.get(0);
case 1:
return pos.view.ratios.get(0);
case 2:
return pos.view.symbols.get(1);
case 3:
return pos.view.ratios.get(1);
case 4:
if(pos.view.symbols.size()>2)
{
return pos.view.symbols.get(2);
}else{return null;}
case 5:
if(pos.view.symbols.size()>2)
{
return pos.view.ratios.get(2);
}else{return null;}
case 6:
if(pos.view.symbols.size()>3)
{
return pos.view.symbols.get(3);
}else{return null;}
case 7:
if(pos.view.symbols.size()>3)
{
return pos.view.ratios.get(3);
}else{return null;}
case 8:
return pos.view.name;
case 9:
return pos.view.qt;
case 10:
return pos.view.current;
case 11:
return pos.view.buy;
case 12:
return pos.view.sell;
case 13:
return pos.view.bid;
case 14:
return pos.view.avg;
case 15:
return pos.view.ask;
case 16:
return pos.view.mkt;
case 17:
return pos.view.p;
case 18:
return pos.view.flip;
case 19:
return pos.view.invert;
case 20:
return pos.view.control;
case 21:
return pos.view.control1;
case 22:
return pos.view.control2;
case 23:
return pos.view.control3;
default:
return null;
}
}
}
TableRender没有手动添加任何缓存。
从表中删除行的方法
AbstractTableModel m =(AbstractTableModel)tableS.getModel();
m.fireTableRowsDeleted(row,row);
插入行的方法:
AbstractTableModel m =(AbstractTableModel)tableS.getModel();
m.fireTableRowsInserted(0, suggested.size()-1);
答案 0 :(得分:1)
从表中删除行的方法......,
插入行的方法......
这两个方法应该是自定义TableModel的一部分,而不是应用程序代码的一部分。 TableModel负责在数据更改时通知表。所以你需要为你的模型创建方法,比如“addRow(...)”和“removeRow(...)”。
确保传递给fireXXX方法的“行”值是正确的。 DefaultTableModel实现了addRow(...)和removeRow(...)方法,因此请查看DefaultTableModel的源代码以查看该代码的工作方式。