如何通过遍历primefaces中的列表来动态地一个接一个地填充列

时间:2013-12-10 10:05:47

标签: jsf jsf-2 primefaces

我需要逐列填充可用选项列表     我在左侧面板和右侧面板中有一个区域列表,有4列和
    10行。现在,如果我选择一个有12个选项的区域'X',则第一列应为
    完全填充,第二列只有2行。我找不到任何有用的链接
    帮助我找到解决问题的方法。有没有办法实现     这在JSF或Primefaces中。

2 个答案:

答案 0 :(得分:3)

因为您没有声明列/行必须显示特定的模型属性,例如idnamemaxmin或其他什么,我假设您只想枚举二维表中的模型。我不认为有这样做的JSF / Primefaces方法。我的解决方案是在将数据返回到视图之前预处理数据。这也是您对模型拥有最大控制权的那一刻。当然它不是最优雅的方式,但在使用JSF / PF时我看不到另一种方式。 处理:

1。)在每一行之后添加一个'空'模型元素(我使用String s),直到达到最大列数

2。)对于行中“另外1个项目”的每一行都这样做,例如22项 - >前两行需要少一个空项

3.。)用空项填充其他行

4。)完成。使用标准的JSF / PF UI组件。

这个小的糟糕/丑陋/黑客攻击代码剪切可能会让你了解预处理。

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



public class Test {

    static int columns = 4;
    static int rows = 10;
    public static void main(String[] args) {
        for (int i = 0; i < 10; i ++) {
            List<String> strings = new ArrayList<String>();
            populate(strings);
            int before = strings.size();
            process(strings);
            int after = strings.size();
            print(before, after, strings);
        }
    }

    private static void print(int before, int after, List<String> strings) {
        System.out.println(before + " ================ " + after);
        for (int row = 0; row < rows; row++) {
            for (int col = 0; col < columns; col++) {
                int index = row * columns + col;
                System.out.print(strings.get(index) + " ");
            }
            System.out.println();
        }
        System.out.println("=====================");
    }

    private static void process(List<String> strings) {
      int regionsSize = strings.size();

      // how much rows have to be filled with 1 empty item less
      int rowsWithMoreToAdd = regionsSize % rows;
      // where we need to insert the empty item
      int index = (int) Math.floor(regionsSize / rows);
      String emptyOption = "   ";

      // insert one empty item less in these rows
      for (int i = 0; i < rowsWithMoreToAdd; i++) {
          // insert empty items until the last column
          for (int ii = index + 1; ii < columns; ii++) {
              strings.add(ii + i * columns, emptyOption);
          }
      }

      // insert empty items in thes rows
      for (int i = rowsWithMoreToAdd; i < rows; i++) {
          // insert empty items until the last column
          for (int ii = index; ii < columns; ii++) {
              strings.add(i * columns + ii, emptyOption);
          }
      }
    }

    private static void populate(List<String> strings) {
        int random = new Random().nextInt(rows * columns);
        for (int i = 0; i < random; i++) {
            strings.add("bla");
        }
    }



}

一些示例输出:

13 ================ 40
bla bla         
bla bla         
bla bla         
bla             
bla             
bla             
bla             
bla             
bla             
bla             

24 ================ 40
bla bla bla     
bla bla bla     
bla bla bla     
bla bla bla     
bla bla         
bla bla         
bla bla         
bla bla         
bla bla         
bla bla         

34 ================ 40
bla bla bla bla 
bla bla bla bla 
bla bla bla bla 
bla bla bla bla 
bla bla bla     
bla bla bla     
bla bla bla     
bla bla bla     
bla bla bla     
bla bla bla     

答案 1 :(得分:2)

这是我的建议:

的index.xhtml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:c="http://java.sun.com/jsp/jstl/core"
      xmlns:p="http://primefaces.org/ui"
      xmlns:o="http://omnifaces.org/ui">

    <h:body>
        <h:form>
            <p:panelGrid columns="#{testBean2.model.cols}">
                <c:forEach var="elem" items="#{testBean2.model.list}">
                    <h:outputText value="#{elem}"/>
                </c:forEach>
            </p:panelGrid>

            <p:commandButton action="#{testBean2.select12}" update="@form" value="select 12" />
            <p:commandButton action="#{testBean2.select24}" update="@form" value="select 24" />
        </h:form>
    </h:body>
</html>

TestBean2.java

@ManagedBean
@ViewScoped
public class TestBean2 implements Serializable
{
    private static final long serialVersionUID = 1L;

    private TransposedTableModel<String> model;

    @PostConstruct
    public void init()
    {
        select12();
    }

    public void select12()
    {
        model = new TransposedTableModel<String>();

        for(int i = 0; i < 12; i++)
        {
            model.add("value " + (i + 1));
        }
    }

    public void select24()
    {
        model = new TransposedTableModel<String>();

        for(int i = 0; i < 24; i++)
        {
            model.add("value " + (i + 1));
        }
    }

    public TransposedTableModel<String> getModel()
    {
        return model;
    }
}

TransposedTableModel.java

public class TransposedTableModel<T>
{
    private final List<T>[] model;
    private int index;

    public TransposedTableModel()
    {
        model = new ArrayList[10];

        for(int i = 0; i < 10; i++)
        {
            model[i] = new ArrayList<>();
        }

        index = 0;
    }

    public void add(T value)
    {
        model[index++ % 10].add(value);
    }

    public List<T> getList()
    {
        List<T> list = new ArrayList<>();
        int cols = model[0].size();

        list.addAll(model[0]);

        for(int i = 1; i < 10; i++)
        {
            List<T> row = model[i];

            for(int j = 0; j < cols; j++)
            {
                list.add(j < row.size() ? row.get(j) : null);
            }
        }

        return list;
    }

    public int getCols()
    {
        return model[0].size();
    }
}