0

We have a data table with 3 columns, the first has a selectBooleanCheckbox and the two last have outputText.

We also set up a filter on this table to show or hide rows depending on the filter boolean value.

The entity used for the data table is made with these 3 columns properties, 1 boolean, 2 String. See below.

The problem is, when we select a filter in the first column such as "Yes" and click the update button, the table will be updated but the filter is not applied thus the table filter is not refreshed.

Step to reproduce:

  1. Load the page, don't modify any checkboxes
  2. Select the filter "Yes"
  3. Press update button
  4. The datatable is not updated

This is my Entity.java

public class Entity {
    boolean                 enabled;
    private String          label;
    private String          description;

    public Entity(boolean enabled, String label, String description) {
        this.enabled    = enabled;
        this.label      = label;
        this.description = description;
    }

    public boolean getEnabled() {
        return enabled;
    }

    public void setEnabled(boolean enabled) {
        this.enabled = enabled;
    }

    public String getLabel() {
        return label;
    }

    public void setLabel(String label) {
        this.label = label;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}

This is my simple bean

import java.util.ArrayList;
import java.util.List;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

@Controller
@Scope ("view")
public class TestBean {
    private List<Entity>    list;

    public TestBean() {
        list = new ArrayList<Entity>();

        /* Populate examples */
        list.add(new Entity(true, "Book", "This is a C book"));
        list.add(new Entity(false, "Screen", "21\" HP Screen"));
        list.add(new Entity(true, "Game", "You won 1 million"));
    }

    /*
     * Update list, in the real application it is a little bit more complicated
     * but I simplified it and the problem is reproducible for this stuff too.
     */
    public void update() {
        Entity entity;

        /* "Disable" the third because we didn't win */
        entity = list.get(2);
        entity.setEnabled(false);
    }

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

    public void setList(List<Entity> list) {
        this.list = list;
    }
}

This is my little bean for the filter boolean value

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

/**
 * The Class BooleanListBean.
 */
@Controller
@Scope ("session")
@SuppressWarnings ("serial")
public class BooleanListBean implements Serializable {

    /**
     * Instantiates a new boolean list bean.
     */
    public BooleanListBean() {
        super();
    }

    /**
     * Gets the options.
     * 
     * @return the options
     */
    public SelectItem[] getOptions() {
        final List<SelectItem> options = new ArrayList<SelectItem>();

        final FacesContext facesContext = FacesContext.getCurrentInstance();
        options.add(new SelectItem("", "Select"));
        options.add(new SelectItem(Boolean.FALSE.toString(), "No"));
        options.add(new SelectItem(Boolean.TRUE.toString(), "Yes"));

        return options.toArray(new SelectItem[0]);
    }
}

And finally the xhtml file

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:fn="http://java.sun.com/jsp/jstl/functions"
    xmlns:p="http://primefaces.org/ui"
    xmlns:ft="http://primefaces.prime.com.tr/facestrace"
    xmlns:t="http://myfaces.apache.org/tomahawk"
    xmlns:util="http://java.sun.com/jsf/composite/components/util">
<ui:composition template="/xhtml/common/toolbarLayout.xhtml">
    <ui:define name="content">
        <p:commandButton value="Update"
            actionListener="#{testBean.update}"
            update=":contentForm:entityList" />

        <p:dataTable value="#{testBean.list}" var="entity" id="entityList" widgetVar="entityList">
            <p:column headerText="Activated"
                filterBy="#{entity.enabled}" filterOptions="#{booleanListBean.options}">

                <h:selectBooleanCheckbox value="#{entity.enabled}" />
            </p:column>

            <p:column headerText="Label">
                <h:outputText value="#{entity.label}" />
            </p:column>

            <p:column headerText="Description">
                <h:outputText value="#{entity.description}" />
            </p:column>
        </p:dataTable>
    </ui:define>
</ui:composition>
</html>
4

1 回答 1

0

我认为 dataTable 应该有过滤的 Value 标签,

filteredValue="#{testBean.filteredList}"

在 testBean 中添加一个过滤器列表并引用它。

于 2012-10-16T14:14:46.627 回答