Динамический ряд на основе схемы PrimeFaces таблиц данных с динамических столбцов - неверное число столбцов


Я должен показать несколько динамических таблиц данных с динамическими столбцами на одной странице. Все работает нормально, если количество столбцов в каждом динамическом datatable одинаковое.

Неправильное поведение возникает, когда в разных таблицах имеется разное количество столбцов. Во всех таблицах отображается столько же столбцов, сколько и в первой таблице списка.

Проверено на:

  • примитивы: 3.4 и 4.0
  • JSF 2.0

Вот код демонстрация проблемы:

EDIT: следующий код присваивает разным таблицам разное количество столбцов. В первой таблице должно быть 8 столбцов, во второй-7 и так далее. Но все таблицы занимают 8 столбцов, то есть они берут количество столбцов из первой таблицы.

Ожидаемый результат: 5 таблиц данных. Первая таблица содержит 8 столбцов, вторая таблица-7 столбцов, третья Таблица-6 столбцов и так далее. ожидаемый выходной скриншот - это собственно выход на ПФ 3.3

Фактический вывод: 5 таблиц, каждая из которых содержит 8 столбцов. Приведенные данные верны. Но также показываются пустые дополнительные столбцы, которые не должны показываться. Фактический Выходной Снимок Экрана

Тест2.xhtml:

<!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:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui">

<f:view contentType="text/html">
    <h:head>
    </h:head>

    <h:body>

        <h:form>

            <ui:repeat value="#{tableBean.tables}" var="table">

                <p:dataTable id="cars" var="car" value="#{table.carsSmall}"
                    style="font-size: 12px;'width: 70%;">
                    <p:columns value="#{table.columns}" var="column"
                        columnIndexVar="colIndex">
                        <f:facet name="header">  
                #{column.header}  
            </f:facet>

                        <h:outputText value="#{car[column.property]}"></h:outputText>
                    </p:columns>

                </p:dataTable>

                <br />
            </ui:repeat>

        </h:form>

    </h:body>



</f:view>
</html>

Таблебин.java :

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

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ManagedBean(name = "tableBean")
@ViewScoped
public class TableBean implements Serializable
{
    private static final long serialVersionUID = 1L;
    private final static List<String> VALID_COLUMN_KEYS = Arrays.asList("model", "manufacturer", "year", "color");
    private final static String[] colors;
    private final static String[] manufacturers;
    private String columnTemplate = "model manufacturer year";

    static
    {
        colors = new String[10];
        colors[0] = "Black";
        colors[1] = "White";
        colors[2] = "Green";
        colors[3] = "Red";
        colors[4] = "Blue";
        colors[5] = "Orange";
        colors[6] = "Silver";
        colors[7] = "Yellow";
        colors[8] = "Brown";
        colors[9] = "Maroon";

        manufacturers = new String[10];
        manufacturers[0] = "Mercedes";
        manufacturers[1] = "BMW";
        manufacturers[2] = "Volvo";
        manufacturers[3] = "Audi";
        manufacturers[4] = "Renault";
        manufacturers[5] = "Opel";
        manufacturers[6] = "Volkswagen";
        manufacturers[7] = "Chrysler";
        manufacturers[8] = "Ferrari";
        manufacturers[9] = "Ford";
    }

    private List<Car> carsSmall;
    private List<ColumnModel> columns = new ArrayList<ColumnModel>();;

    private List<TableBean> tables;

    public List<TableBean> getTables()
    {
        if (tables == null)
        {
            tables = new ArrayList<TableBean>();
            for (int i = 0; i < 5; i++)
            {
                TableBean t = new TableBean();

                for (int j = 5; j > i; j--)
                {
                    t.columnTemplate += " year";
                    t.createDynamicColumns();
                }
                tables.add(t);
            }
        }

        return tables;
    }

    public TableBean()
    {
        carsSmall = new ArrayList<Car>();

        populateRandomCars(carsSmall, 9);

        createDynamicColumns();
    }

    private void populateRandomCars(List<Car> list, int size)
    {
        for (int i = 0; i < size; i++)
            list.add(new Car(getRandomModel(), getRandomYear(), getRandomManufacturer(), getRandomColor()));
    }

    public List<Car> getCarsSmall()
    {
        return carsSmall;
    }

    private int getRandomYear()
    {
        return (int) (Math.random() * 50 + 1960);
    }

    private String getRandomColor()
    {
        return colors[(int) (Math.random() * 10)];
    }

    private String getRandomManufacturer()
    {
        return manufacturers[(int) (Math.random() * 10)];
    }

    private String getRandomModel()
    {
        return UUID.randomUUID().toString().substring(0, 8);
    }

    public List<ColumnModel> getColumns()
    {
        return columns;
    }

    public String[] getManufacturers()
    {
        return manufacturers;
    }

    public String[] getColors()
    {
        return colors;
    }

    static public class ColumnModel implements Serializable
    {
        private static final long serialVersionUID = 1L;
        private String header;
        private String property;

        public ColumnModel(String header, String property)
        {
            this.header = header;
            this.property = property;
        }

        public String getHeader()
        {
            return header;
        }

        public String getProperty()
        {
            return property;
        }

        @Override
        public String toString()
        {
            return "[header=" + header + ", property=" + property + "]";
        }
    }

    public void createDynamicColumns()
    {
        String[] columnKeys = columnTemplate.split(" ");
        columns.clear();

        for (String columnKey : columnKeys)
        {
            String key = columnKey.trim();

            if (VALID_COLUMN_KEYS.contains(key))
            {
                columns.add(new ColumnModel(columnKey.toUpperCase(), columnKey));
            }
        }
    }
}

Машина.java:

import java.io.Serializable;

public class Car implements Serializable
{
    private static final long serialVersionUID = 1L;
    private String model;
    private int year;
    private String manufacturer;
    private String color;

    public Car(String model, int year, String manufacturer, String color)
    {
        super();
        this.model = model;
        this.year = year;
        this.manufacturer = manufacturer;
        this.color = color;
    }

    public String getModel()
    {
        return model;
    }

    public void setModel(String model)
    {
        this.model = model;
    }

    public int getYear()
    {
        return year;
    }

    public void setYear(int year)
    {
        this.year = year;
    }

    public String getManufacturer()
    {
        return manufacturer;
    }

    public void setManufacturer(String manufacturer)
    {
        this.manufacturer = manufacturer;
    }

    public String getColor()
    {
        return color;
    }

    public void setColor(String color)
    {
        this.color = color;
    }

}
1 2

1 ответ:

Я думаю, что вы должны использовать Primefaces 3.3, потому что он показывает, как ожидается, как и в моем случае. Пока это будет работать, но я постараюсь зафиксировать это на Primefaces 4.0 тоже.

Пожалуйста, найдите прилагаемое изображение для того же самого. изображение