8

私のアプリケーションでは、ボタンをクリックして行を追加する必要があり、このボタンはすべての行にあります。これを行うにはヘルプが必要ですか?

アイテム クラス

public class Item {
 public Item()
{

}
private String value;
public Item(String value) { this.value = value; }
public void setValue(String value) { this.value = value; }
public String getValue() { return value; }
}

Bean クラスの管理

public class MyMB 
{
private List<Item> list;    

public void addItem() { // JSF action method
    list.add(new Item("Default"));
    Iterator<Item> iterator = list.iterator();
    while(iterator.hasNext())
    {
        Item item = (Item)iterator.next();
        System.out.println(item.getValue());
    }
    System.out.println();
    }
/**
 * @return the list
 */
public List<Item> getList() {
    if(list==null)
    {
        loadList();
    }
    return list;
}
private void loadList() {
    list = new ArrayList<Item>();
    list.add(new Item("Data"));
}

}

JSF コード

<h:form>
   <rich:dataTable value="#{myMB.list}" var="item" id="tabel">
    <h:column><h:inputText value="#{item.value}" /></h:column>
    <h:column><a4j:commandButton value="Add"  actionListener="#{myMB.addItem}" reRender="tabel"/></h:column>

4

2 に答える 2

2

例として、次の表を取り上げます。

<h:datatable value="#{myBean.list}" ...>
    ...
    <h:column>
       <h:commandButton value="Add a row" action="#{myBean.addRow}"/>
    </h:column>
</h:datatable>

メソッドmyBean.addRowは、リストに新しい要素を追加するだけです。

public class MyBean {

    private List<SomeClass> list;

    ...

    public List<SomeClass> getList() {
        return list;
    }

    public void addRow() {
        list.add(new SomeClass());
    }
}

ボタンをクリックすると、メソッドaddRowがリストに新しい要素を追加します。ページが更新され、テーブルが新しい行で表示されます。

編集:

あなたの投稿版に関して、3つのこと:

Point 1:エラーのスタックトレースを添付していただけますか?

ポイント 2:メソッド addRowStringは、JSF がナビゲーションに使用する ID を返します。このアクションにはナビゲーションが含まれない (つまり、ユーザーが同じページにとどまる) ため、単純にnullorを返し""ます。

public String addRow() {
    list.add(new Item("new data"));
    return null;
}

ポイント 3:Itemクラスが (現在のコンストラクターに加えて) 空のコンストラクターを提供することをお勧めします。

public Item() {
}
于 2010-02-17T07:17:39.827 に答える