在我的应用程序需要在一个按钮的点击添加行,这个按钮会在所有行。需要帮助做到这一点?

<强>物品类

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>

    

有帮助吗?

解决方案

所有你需要做的基本上是确实只是添加一个空的对象valueh:dataTable属性背后的数据模型。

但是,同样的空行需要在后续请求被保留为好。如果支持bean的请求范围,那么数据模型得到重新加载没有空行。这当bean是会话范围都应该工作。

另外还有在JSF代码的几个误区。所述h:dataTable var属性丢失和列含量需要为一个h:column内部。

<h:form>
    <h:dataTable value="#{bean.list}" var="item">
        <h:column><h:inputText value="#{item.value}" /></h:column>
    </h:dataTable>
    <h:commandButton value="Add" action="#{bean.add}"/>
</h:form>

一个的会话或视图作用域豆可以是这样的:

public class Bean {
    private List<Item> list;

    public Bean() {
        list = new ArrayList<Item>();
    }

    public void add() {
        list.add(new Item());
    }

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

Item类当然应该具有默认的无参数构造。通常情况下,这已经是默认可用,但如果你用的参数定义自己的构造函数,那么就不再可用。你需要明确定义它,否则你不能做Item item = new Item();了。

public class Item {

    private String value;

    public Item() {
        // Keep default constructor alive.
    }

    public Item(String value) {
        this.value = value;
    }

    // ...
}

如果你喜欢保持在豆在请求范围,然后你需要保持新增项目的数量,从而使bean可以保护负载相同的金额。

public class Bean {
    private List<Item> list;
    private HtmlInputHidden count = new HtmlInputHidden();

    public Bean() {
        count.setValue(0);
    }

    public void add() {
        list.add(new Item());
    }

    public List<Item> getList() {
        if (list == null) loadList();
        return list;
    }

    public HtmlInputHidden getCount() {
        return count;
    }

    public void setCount(HtmlInputHidden count) {
        this.count = count;
    }

    private void loadList() {
        list = new ArrayList<Item>();

        // Preserve list with newly added items.
        for (int i = 0; i < (Integer) count.getValue(); i++) {
            list.add(new Item());
        }
    }
}

您只需要以下添加到JSF页面的<h:form>

<h:inputHidden binding="#{bean.count}" converter="javax.faces.Integer" />

有关以任何方式使用数据表更多的见解你会发现这篇文章有用:使用数据表的。它也包含与很多的请求和会话范围实例WAR文件。

其他提示

以该表作为一个示例:

<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 的将在列表中添加新元素的。页面将刷新,并用一个新的行显示表

编辑:

关于你的帖子版,三件事情:

点1:的你能请附上错误的堆栈跟踪

点2:你的方法addRow返回String其对于导航使用JSF的ID。作为该动作不涉及任何导航(即,用户停留在同一页上),简单地返回null""

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

点3:我建议你的类Item提供一个空的构造(除了当前的构造的):

public Item() {
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top