Primefaces dataTable与复选框不起作用

时间:2013-11-27 11:07:37

标签: checkbox primefaces datatable jsf-2.2

我正在使用Primefaces 4.0和jsf2.2。

当我使用带有复选框的dataTable时,每当我选择记录时,它都不会发回任何记录。

单击复选框后,它应该发回记录。

我删除了额外的东西,让我的代码很简单,以便测试它:

每秒都有一个轮询打印所选项目,以便我可以检查是否有回送的内容。

在这样做之后,我发现没有任何回复。 这是我的代码:

页:

<h:head>
    <title>System Monitor</title>

</h:head>

<h:body>
    <h:form>
        <p:poll interval="1" listener="#{indexBean.printSelect()}"/> 
    </h:form> 

    <h:form>     

        <p:dataTable id='data' var="proc" value="#{indexBean.procStatus}"
                     rowKey="#{proc.pid}" selection="#{indexBean.selectedProcs}">
            <p:column>
                <f:facet name='header'>
                    <h:outputText value='Process Name'/>
                </f:facet>
                <h:outputText styleClass="outputCell" id="pname" value='#{proc.name}'/>
            </p:column>
            <p:column selectionMode="multiple"/>
        </p:dataTable>

    </h:form>
</h:body>

支持Bean:

@ManagedBean(name = "indexBean")
@ViewScoped
public class indexBean implements Serializable {
private ProcStatDataModel procStatus;
private SingleProcess[] selectedProcs;

@PostConstruct
public void loadProcStat() {
    List<SingleProcess> temp = new ArrayList<>();
    temp.add(new SingleProcess("test1"));
    temp.add(new SingleProcess("test2"));
    temp.add(new SingleProcess("test3"));
    procStatus = new ProcStatDataModel(temp);
}

public void printSelect() {
    if (selectedProcs != null) {
        String str = "";
        for (SingleProcess sp : selectedProcs) {
            str += sp.getName() + "_";
        }
        System.out.print(str);
    } else {
        System.out.println("selectedProcs is null");
    }
}

public ProcStatDataModel getProcStatus() {
    return procStatus;
}

public SingleProcess[] getSelectedProcs() {
    return selectedProcs;
}

public void setSelectedProcs(SingleProcess[] selectedProcs) {
    this.selectedProcs = selectedProcs;
}
}

我之前尝试将rowCheckListenerthis联系起来,但徒劳无功。

此外,我尝试添加f:view contentType="text/html" this,但没有帮助。

这很奇怪,因为我对primefaces show case的情况做了同样的事情,并且它按照我的想法行事。所以我认为这种方法没问题,我的代码应该有问题。

感谢任何帮助。提前谢谢。

1 个答案:

答案 0 :(得分:0)

我做了一些改动,但它确实奏效了。不确定,哪一个是解决方案。

1)将所有'改为'。

2)我认为数据表的value="#{indexBean.procStatus}"是错误的。我将其更改为类中ArrayList的名称。所以,它变成了value="#{indexBean.procStatus.mylist}"

3)添加了一个ajax监听器,就像你在问题中提到的那样。 <p:ajax event="rowSelectCheckbox" listener="#{indexBean.check}" />

4)将pid添加到构造函数中,这将是我们的rowKey。

5)现在,轮询打印数组。

结果xhtml如下:

<h:head>
    <title>System Monitor</title>

</h:head>

<h:body>
    <h:form>
        <p:poll interval="1" listener="#{indexBean.printSelect()}"/> 
    </h:form> 

    <h:form>     

        <p:dataTable id="data" var="proc" value="#{indexBean.procStatus.mylist}"
                     rowKey="#{proc.pid}" selection="#{indexBean.selectedProcs}">
                     <p:ajax event="rowSelectCheckbox" listener="#{indexBean.check}"   />
            <p:column>
                <f:facet name="header">
                    <h:outputText value="Process Name"/>
                </f:facet>
                <h:outputText styleClass="outputCell" id="pname" value="#{proc.name}"/>
            </p:column>
            <p:column selectionMode="multiple"/>
        </p:dataTable>

    </h:form>
</h:body>
</ui:composition>

豆:

@ManagedBean(name = "indexBean")
@ViewScoped
public class indexBean implements Serializable {
private ProcStatDataModel procStatus;
private SingleProcess[] selectedProcs;

@PostConstruct
public void loadProcStat() {
    List<SingleProcess> temp = new ArrayList<SingleProcess>();
    temp.add(new SingleProcess("test1",1));
    temp.add(new SingleProcess("test2",2));
    temp.add(new SingleProcess("test3",3));
    procStatus = new ProcStatDataModel(temp);
}

public void printSelect() {
    if (selectedProcs != null) {
        String str = "";
        for (SingleProcess sp : selectedProcs) {
            str += sp.getName() + "_";
        }
        System.out.print(str);
    } else {
        System.out.println("selectedProcs is null");
    }
}

public ProcStatDataModel getProcStatus() {
    return procStatus;
}

public SingleProcess[] getSelectedProcs() {
    return selectedProcs;
}

public void setSelectedProcs(SingleProcess[] selectedProcs) {
    this.selectedProcs = selectedProcs;
}
public void check(SelectEvent event) {
    System.out.println("in check");
}
}