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