JTable呈现删除的JButton而不是新的JButton

时间:2014-03-06 17:41:00

标签: java swing jtable abstracttablemodel

程序一般是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);

1 个答案:

答案 0 :(得分:1)

  

从表中删除行的方法......,

     

插入行的方法......

这两个方法应该是自定义TableModel的一部分,而不是应用程序代码的一部分。 TableModel负责在数据更改时通知表。所以你需要为你的模型创建方法,比如“addRow(...)”和“removeRow(...)”。

确保传递给fireXXX方法的“行”值是正确的。 DefaultTableModel实现了addRow(...)和removeRow(...)方法,因此请查看DefaultTableModel的源代码以查看该代码的工作方式。