2013-12-19 56 views
2

我试图为名为“clients”的集合实现AbstractTableModel,但我一直收到“add”方法的错误“required variable found value”。 这是我的代码:为Java集合实现AbstractTableModel

我很抱歉造成的混乱。 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(); 
     } 
    } 
+0

fireTableDataChanged();是错误的通知并且在由@Ian罗伯茨回答是描述重置整个模型,但都回答在这里走错了路,你的模式是错误的,通知是错误的,你可以使用任何(理论上)Java数组作为AbstractTableModel的底层数组,因此不需要在一个元素中添加元素rray to model – mKorbel

回答

0

我相信这是和this question一样的问题......你的变量赋值是相反的。

它应该是(尽管此代码仍是不正确 - 见下文):

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

编辑:这已经由普拉巴卡兰回答,但显然人们认为有必要downvote我的答案..我想我确实解决了原始问题,但是我很欣赏我的代码示例仍然不正确,因此我会尽力提供更完整的答案:

首先,对于“找不到必需的变量”错误,如果您google你会看到其他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)调用 - 因为它似乎符合该方法的原意。

+0

在方法上使用'++'返回值不太可能工作... –

+0

确实。对不起,我只解决了关于“所需变量找到值”错误的原始问题。 – hinerm

+0

哇!它实际上与clients.add(c)一起工作!唯一的问题是,对于我介绍的每个客户端来说,该表格会添加2行,其中包含相同的信息。 – bluesony

0

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

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

3

做这样

变化

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

clients.add(c); 

现在你的方法看起来像

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

不知道你如何让clients.size();相信客户集合存在于ModelTabel类中。

+0

对于造成的混乱,我感到抱歉。 add方法是为了在表中添加一个新的客户端(我的意思是一个新的行)。我不想为该集合添加新的客户端。 – bluesony

3

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

clients.add(a); 

此外,您应该触发一个更具体的修改事件,而不是简单地“表更改”。调用fireTableDataChanged基本上告诉听众“这个模型中的数据已经被改变超出了认识,抛弃了你当前的视觉表示,而是建立了一个全新的视觉表示”。这将是更有效,并提供更好的用户体验,相反,如果你使用

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

其中特别说“一个新行已被添加到该模型的结尾,但数据的其余部分是不变的。”

+0

(这比我的回答要好) - 他没有说收集是如何初始化或访问的;如果集合被添加到摆动线程之外,那么他可能需要同步他的列表。一个选项:'clients = Collections.SynchronizedList(new ArrayList ());' – JVMATL

+0

+1 fireTableRowsInserted,但重要的是错误的模型设计 – mKorbel

2

只是保持简单。你有一个客户arraylist权利?

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(); 
     } 
    } 
+0

是的,但它应该是'ArrayList ' –

+0

更新.....ö.. .. –

+0

现在好了:-) –

0

如果您展示如何您的收藏(我假设这是一个列表正在申报

话虽这么说,你的add方法没有任何意义这将帮助:我想你的意思:

{ 
    clients.add(c); 
    fireTableDataChanged() 
} 
相关问题