【问题标题】:How to populate columns one after another dynamically by iterating over list in primefaces如何通过迭代primefaces中的列表来动态填充列
【发布时间】:2013-12-10 10:05:46
【问题描述】:

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

【问题讨论】:

  • 答:是的,有。
  • 感谢 J4mes 先生。我可以在 ajax 调用上显示特定于区域的选项,但我的问题是如何以我所询问的格式表示数据。您能否尝试为实际问题提出一种方法。

标签: jsf jsf-2 primefaces


【解决方案1】:

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

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

2.) 对每行中的“另外一个项目”执行此操作,例如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");
        }
    }



}

一些示例输出:

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     

【讨论】:

    【解决方案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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-10-04
      • 1970-01-01
      • 2020-07-22
      • 1970-01-01
      • 1970-01-01
      • 2012-08-16
      • 1970-01-01
      • 2018-08-24
      • 1970-01-01
      相关资源
      最近更新 更多