0

我已经弄清楚为什么我的数组列表总是返回 0 的大小,但我无法解决问题。我有一个带有“addHuman(Human h) 方法的自定义模型,该方法旨在添加到数组中。唯一的问题是它没有。现在,如果我要使用常规方法,比如 model.add(index,对象o)它实际上会起作用并增加我的arraylist的大小,但不会显示在我的jtable上。我的问题是如何让我的自定义addHuman方法工作?非常感谢任何帮助!

以下是使用该方法的主类。当我单击按钮添加个人时,它应该将人类添加到我的 HumanListModel 中:

addIndividual.addActionListener(new ActionListener()
{

public void actionPerformed(ActionEvent event)
{

    Human temp;

    try {

        temp = new Human();         
        modelx.addHuman(indexPoint, temp); 
///the addHuman method does display on jtable but doesn't increment arraylist, meaning that the size is always 0 which creates many problems/////

                   //modelx.add(indexPoint, temp); does indeed increment the arraysize but then it doesn't display the values on the jtable////

        indexPoint++;



        System.out.println(modelx.size());  
        } 
        catch (FileNotFoundException e) 
            {
                e.printStackTrace();
            }   
    newbiex.revalidate(); ////is the jtable////
                }
    });

这是我的自定义 HumanListModel:

public class HumanListModel extends DefaultListModel implements TableModel
{

    private ArrayList<Human> data;

    public HumanListModel()
    {
        super();
        data = new ArrayList<Human>();
    }

public void addHuman(int k, Human h)
{
    data.add(k, h);
    fireIntervalAdded(this, data.size(), data.size());

}

    public Human getHuman(int o)
    {
        return data.get(o);
    }

    public void removeHuman(Human h)
    {
        data.remove(h);
    }

    public int getColumnCount()
    {
        // the number of columns you want to display
        return 1;
    }

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

    public Object getValueAt(int row, int col)
    {
        return (row < data.size()) ? data.get(row) : null;
    }

    public String getColumnName(int col)
    {
        return "Human";

    }

    public Class getColumnClass(int col)
    {
        return Human.class;
    }

    public void addTableModelListener(TableModelListener arg0) {
}

@Override
public boolean isCellEditable(int arg0, int arg1) {
    return false;
}

public void removeTableModelListener(TableModelListener arg0) {
    }


public void setValueAt(Object arg0, int arg1, int arg2) {
}

}
4

1 回答 1

0

当您更改底层数据时,您必须触发模型更改

public void addHuman(Human h)
{
   data.add(h); 
    fireIntervalAdded(this, data.size(), data.size());
}

每当您更改基础数据以告诉 List 它必须更新屏幕图像时,都需要调用具有类似事件的类似方法。

例如,removeHuman()将需要类似的调用。请参阅http://docs.oracle.com/javase/6/docs/api/javax/swing/AbstractListModel.html上的 javadoc,了解执行此操作的方法。(在本例中,fireIntervalRemoved()事件需要包含删除行的索引。)

您还需要一个getElementAt()方法来返回该行的数据元素。在您的情况下,返回该Human行,但它需要一个toString()方法。或者,您可以从 格式化字符串Human 并将其返回。

注意-此答案的先前版本是基于我的困惑,认为这是 TableModel 而不是 ListModel。它已被修复。

于 2013-06-04T20:16:19.117 回答