2013-12-10 45 views
-2

我有要求逐列填充可用選項列表。
我有一個左側面板和右側面板4列的區域列表和
10行。現在,如果我選擇有12個選項的區域「X」,則第一列應該全部填充
,第二列只有2行。我找不到任何有用的鏈接
幫助我找出解決問題的方法。有什麼辦法可以在JSF或Primefaces中實現
如何通過遍歷primefaces中的列表動態地逐列填充列

+0

答:是的,有。 –

+0

http://www.mkyong.com/jsf2/jsf-2-0-ajax-hello-world-example/ –

+0

謝謝Mr.J4mes。我可以在ajax調用中顯示區域特定的選項,但是我的問題是如何以我詢問的格式表示數據。你能否試着爲實際問題提出建議。 –

回答

3

因爲你沒有說明該列/行必須顯示具體型號如屬性,idnamemaxmin或什麼的,我以爲你只是想在你的二維表列舉的典範。我不認爲有一個JSF/Primefaces的方式來做到這一點。我的解決方案是在將數據返回到視圖之前對其進行預處理。那也是你對模型擁有最大控制權的時刻。當然,這不是最優雅的方式,但使用JSF/PF時我看不到另一種方式。 處理:

1)只要每行後追加一個「空」的模型元素(我用String S),直至達到

2.最大colums)執行,每行這是「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"); 
     } 
    } 



} 

一些示例輸出:

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