为Java集合实现AbstractTableModel

我正在尝试为名为“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(); } } 

我相信这是与这个问题相同的问题……你的变量赋值是相反的。

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

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

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

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

接下来,对于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)调用 – 因为它似乎符合该方法的原始意图。

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

 clients.add(a); 

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

 fireTableRowsInserted(clients.size() - 1, clients.size() - 1); 

具体说“在这个模型的末尾添加了一个新行,但其余数据没有变化”。

这样做

更改

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

 clients.add(c); 

现在你的方法看起来像

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

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

保持简单。 你有客户的arraylist吗?

 class ModelTabel extends AbstractTableModel{ ArrayList clients = new ArrayList(); 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(); } } 

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

话虽如此,您的客户在哪里可变? 它在哪里宣布? 初始化? 我认为你的模型需要这个工作并且有意义。

如果你展示你的collections(我假设它是一个List?)正在被宣布,那将会有所帮助。

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

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