0

arraylist が常に 0 のサイズを返す理由はわかりましたが、問題を解決できません。配列に追加することを目的とした "addHuman(Human h)" メソッドを持つカスタム モデルがあります。唯一の問題は、そうでないことです。ここで、通常のメソッドを使用する場合は、model.add(index,オブジェクト o) 実際には機能し、arraylist のサイズをインクリメントしますが、jtable には表示されません.私の質問は、カスタムの addHuman メソッドでこれを機能させるにはどうすればよいですか?

以下は、そのメソッドを使用するメイン クラスです。addIndividual のボタンをクリックすると、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 返すこともできます。

- この回答の以前のバージョンは、これが ListModel ではなく TableModel であると考えていた私の混乱に基づいていました。修正されました。

于 2013-06-04T20:16:19.117 に答える