为Java集合实现AbstractTableModel

时间:2013-12-19 13:53:16

标签: java swing jtable tablemodel

我正在尝试为名为“clients”的集合实现AbstractTableModel,但我仍然收到“add”方法的错误“required variable found value”。 这是我的代码:

我很抱歉造成了混乱。 add方法是为了在表中添加一个新客户端(我指的是一个新行)。我不想在集合中添加新客户端。

class ModelTabel extends AbstractTableModel{

    public int getRowCount() {
        return clients.size();
    }

    public int getColumnCount() {
        return 4;
    }

    public Object getValueAt(int row, int column) {
        Client c = clients.get(row-1);
        switch(column){
            case 0: return c.getName();
            case 1: return c.getSurname();
            case 2: return c.getID();
            case 3: return c.getPhone();
            default:return "ERROR";
        }
    }

    public void add(Client c) {
        clients.get(clients.size()++) = a;
        fireTableDataChanged();
        }
    }

6 个答案:

答案 0 :(得分:3)

喜欢这个

变化

clients.get(clients.size()++) = a;

clients.add(c); 

现在您的方法看起来像

public void add(Client c) {
    clients.add(c); 
    fireTableDataChanged();
    }
}

不确定如何获得clients.size();相信客户收集出现在ModelTabel类中。

答案 1 :(得分:3)

你不能++方法的返回值,因为++的参数必须是在赋值左侧有效的东西。如果您想在Collection的末尾添加内容,那么正确的方法是使用add方法。

clients.add(a);

此外,您应该触发更具体的修改事件,而不仅仅是“更改表格”。调用fireTableDataChanged本质上告诉听众“此模型中的数据已经变得无法识别,丢弃了当前的可视化表示并构建了一个全新的视觉表示”。如果使用

,它会更高效并提供更好的用户体验
fireTableRowsInserted(clients.size() - 1, clients.size() - 1);

具体说明“在此模型的末尾添加了一个新行,但其余数据未更改”。

答案 2 :(得分:2)

保持简单。你有客户的辩护人吗?

class ModelTabel extends AbstractTableModel{

    ArrayList<Client> clients = new ArrayList<Client>();

    public int getRowCount() {
        return clients.size();
    }

    public int getColumnCount() {
        return 4;
    }

    public Object getValueAt(int row, int column) {
        Client c = clients.get(row);
        switch(column){
            case 0: return c.getName();
            case 1: return c.getSurname();
            case 2: return c.getID();
            case 3: return c.getPhone();
            default:return "ERROR";
        }
    }

    public void add(Client c) {
        clients.add(c);
        fireTableDataChanged();
        }
    }

答案 3 :(得分:0)

请显示完整的错误消息,而不是错误的解释。请显示导致错误的文本行。

话虽如此,您的客户在哪里可变?宣布在哪里?初始化?我认为你的模型需要这个才能发挥作用。

答案 4 :(得分:0)

我认为这与this question的问题相同......您的变量分配正好相反。

它应该是(虽然这段代码仍然不正确 - 见下文):

a = clients.get(clients.size()++);
编辑:Prabhakaran已经回答了这个问题,但显然人们觉得有必要回答我的答案。我想我确实解决了原来的问题,但我很欣赏我的代码示例仍然不正确,所以我会尝试提供一个更完整的答案:

首先,关于“未找到所需变量”错误,如果你谷歌它,你会看到其他SO问题作为第一个命中。 clients.get(clients.size()++)不是变量,因此您无法为其分配内容。我不确定在代码中声明a的位置,但是假设它是一个变量,因此我建议撤消赋值。

接下来,对于clients.get(clients.size()++)行,正如其他人提到或暗示的那样 - VAR++等同于VAR = VAR + 1,所以再次进行分配操作。在这种情况下,clients.size()不是变量,因此您无法递增它。如果你想要clients.size() + 1索引,你可以写一下:a = clients.get(clients.size() + 1) ...但这会引发ArrayIndexOutOfBoundsException,因为你试图访问clients的元素超出现有规模!

这就是为什么Prabhakaran重写了你的方法,将该行改为clients.add(c)调用 - 因为它似乎符合该方法的原始意图。

答案 5 :(得分:0)

如果你展示你的收藏(我假设它是一个列表?)正在宣布它会有所帮助。

话虽如此,你的添加方法没有意义:我认为你的意思是:

{
  clients.add( c );
  fireTableDataChanged()
}