Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 如何通过迭代primefaces中的列表来动态地逐个填充列_Jsf_Jsf 2_Primefaces - Fatal编程技术网

Jsf 如何通过迭代primefaces中的列表来动态地逐个填充列

Jsf 如何通过迭代primefaces中的列表来动态地逐个填充列,jsf,jsf-2,primefaces,Jsf,Jsf 2,Primefaces,我需要一列一列地填写可用选项列表。 我在左面板和右面板中有一个区域列表,有4列和 10排。现在,如果我选择一个有12个选项的区域“X”,第一列应该 完全填充,第二列仅填充2行。我找不到任何有用的链接 帮助我找到解决问题的方法。有什么方法可以实现 这是在JSF或Primefaces中实现的。因为您没有声明列/行必须显示特定的模型属性,例如,id、name、max、min或其他什么,所以我假设您只想在二维表中枚举一个模型。我认为没有一种JSF/Primefaces方法可以做到这一点。我的解决方案是在

我需要一列一列地填写可用选项列表。
我在左面板和右面板中有一个区域列表,有4列和
10排。现在,如果我选择一个有12个选项的区域“X”,第一列应该
完全填充,第二列仅填充2行。我找不到任何有用的链接
帮助我找到解决问题的方法。有什么方法可以实现

这是在JSF或Primefaces中实现的。

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

1.)只需在每一行后面附加一个“空”模型元素(我使用了
String
s),直到达到最大列数

2.)对行中“多1项”的每一行执行此操作,例如22项->前2行需要少1项空项

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");
        }
    }



}
这是我的建议:

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;
    }
}
@ManagedBean
@视域
公共类TestBean2实现了可序列化
{
私有静态最终长serialVersionUID=1L;
私有传输模型;
@施工后
公共void init()
{
选择12();
}
公共空间选择12()
{
模型=新的TransposedTableModel();
对于(int i=0;i<12;i++)
{
增加(“价值”+(i+1));
}
}
公共空间选择24()
{
模型=新的TransposedTableModel();
对于(int i=0;i<24;i++)
{
增加(“价值”+(i+1));
}
}
公共传输表模型getModel()
{
收益模型;
}
}
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();
    }
}
公共类TransposedTableModel
{
私有最终列表[]模型;
私有整数索引;
公共交通表模型()
{
模型=新阵列列表[10];
对于(int i=0;i<10;i++)
{
模型[i]=新的ArrayList();
}
指数=0;
}
公共无效添加(T值)
{
模型[index++%10]。添加(值);
}
公共列表getList()
{
列表=新的ArrayList();
int cols=model[0].size();
list.addAll(模型[0]);
对于(int i=1;i<10;i++)
{
列表行=模型[i];
对于(int j=0;j
回答:是的,有。谢谢J4mes先生。我可以在ajax调用中显示特定于区域的选项,但我的问题是如何以我所提出的格式表示数据。你能为实际问题提出一个解决办法吗。
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();
    }
}