2013-09-29 27 views
1

我是Richfaces框架中的新成員,我將在我的工作中最近的項目中使用它。rich:列排序無法解析

我已經創建了一些簡單的例子,其中我有豐富的:dataTable和我想讓列進行排序。我已閱讀教程(http://docs.jboss.org/richfaces/latest_3_3_X/en/devguide/html/rich_column.html),我需要的是將「sortBy」參數鍵入「rich:column」標籤。不幸的是列不能排序。有誰能夠幫助我?下面我簡單的應用程序的源代碼:

<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
xmlns:h="http://java.sun.com/jsf/html" 
xmlns:f="http://java.sun.com/jsf/core" 
xmlns:ui="http://java.sun.com/jsf/facelets" 
xmlns:a4j="http://richfaces.org/a4j" 
xmlns:rich="http://richfaces.org/rich"> 

<f:view> 
    <h:head></h:head> 
    <h:body> 
    <rich:panel header="Richfaces dataTable"> 
    <rich:dataTable value="#{TaskListBean.dataList}" var="dataItem" 
    rows="4" columnClasses="50,100,100,100" 
    onRowMouseOver="this.style.backgroundColor='#B5F3FB'" 
    onRowMouseOut="this.style.backgroundColor='#{a4jSkin.rowBackgroundColor}'" 
    width="350"> 

    <f:facet name="caption"> 
    <h:outputText value="This is the caption" /> 
    </f:facet> 

    <f:facet name="header"> 
    <h:outputText value="Trouble Ticket Systems" /> 
    </f:facet> 

    <rich:column colspan="4"> 
    <h:outputText value="Trouble Tickets opened" /> 
    </rich:column> 

    <rich:column sortBy="#{dataItem.taskInstanceId}"> 
    <f:facet name="header">Ticket Id</f:facet> 
    <h:outputText value="#{dataItem.taskInstanceId}" /> 
    </rich:column> 

    <rich:column sortBy="#{dataItem.taskNode}"> 
    <f:facet name="header">Status</f:facet> 
    <h:outputText value="#{dataItem.taskNode}" /> 
    </rich:column> 

    <rich:column sortBy="#{dataItem.actorId}"> 
    <f:facet name="header">Actor</f:facet> 
    <h:outputText value="#{dataItem.actorId}" /> 
    </rich:column> 

    <rich:column> 
    <f:facet name="header">Description</f:facet> 
    <h:outputText value="#{dataItem.description}" /> 
    </rich:column> 

    <f:facet name="footer"> 
    <h:outputText value="This is the footer" /> 
    </f:facet> 

    </rich:dataTable> 
    </rich:panel> 
    </h:body> 
</f:view> 

我的應用程序的

Menaged豆:

package richfacesr; 

import java.io.Serializable; 
import java.util.ArrayList; 
import java.util.List; 

import javax.faces.bean.ManagedBean; 

@ManagedBean(name = "manager") 
public class TaskListBean implements Serializable { 

private ArrayList dataList; 

public void loadDataList() { 

    dataList = new ArrayList(); 

    TaskListData data1 = new TaskListData(); 
    data1.setTaskInstanceId(1000l); 
    data1.setActorId("Willy smith"); 
    data1.setTaskNode("In Charge"); 
    data1.setDescription("CR 123456"); 

    TaskListData data2 = new TaskListData(); 
    data2.setTaskInstanceId(1001l); 
    data2.setActorId("Frank Sinatra"); 
    data2.setTaskNode("Rejected"); 
    data2.setDescription("CR 654321"); 

    dataList.add(data1); 
    dataList.add(data2); 

    } 

public List<TaskListData> getDataList() { 
    loadDataList(); 
    return dataList; 
    } 

} 

和對象:

package richfacesr; 
import java.util.ArrayList; 
import java.util.List;  

public class TaskListData { 
    private String taskNode; 
    private long taskInstanceId; 
    private String actorId; 
    private String description; 

    public String getActorId() { 
    return actorId; 
    } 
    public void setActorId(String actorId) { 
    this.actorId = actorId; 
    } 
    public String getTaskNode() { 
    return taskNode; 
    } 
    public void setTaskNode(String currentNode) { 
    this.taskNode = currentNode; 
    } 
    public String getDescription() { 
    return description; 
    } 
    public void setDescription(String description) { 
    this.description = description; 
    } 
    public long getTaskInstanceId() { 
    return taskInstanceId; 
    } 
    public void setTaskInstanceId(long taskInstanceId) { 
    this.taskInstanceId = taskInstanceId; 
    } 
} 
+0

您使用JSF 2.x和Richfaces 4.X或JSF 1.X和Richfaces 3.X嗎?我知道你發佈了Richfaces 3文檔的鏈接,但這可能是一個錯誤... – cheffe

+0

感謝您的配偶。我知道這是教程中的其他版本的JSF,但我認爲它們與前者兼容......?我正在使用JSF 2.2和Richfaces 5.0.0 Alpha1版本。 我正在使用Websphere,並且在其環境中配置項目非常困難,所以我從Maven原型創建了一個項目。如果你對Richfaces的最終版本有更好的原型(假設它會成爲我的問題(?)的解決方案),它將非常感謝:) –

+0

你打算在生產中使用該項目嗎?如果是這樣,我會建議回滾到Richfaces 4.由於Richfaces 5仍然是_alpha_,它甚至沒有接近生產穩定性,或者該項目運行半年以上?那麼你肯定會面對RF 5的發佈。 – cheffe

回答

1

Taken from the Richfaces 4 documentation,內置了對數據表排序不起作用。

內置排序控件僅適用於extendedDataTable組件。 dataTable組件中對內置排序控件的支持將添加到後續版本中。

它做了work in Richfaces 3,但似乎它們已經發生了一些變化,所以這個功能目前不適用於RichFX 4。

儘管你說你使用的是Alpha1的Richfaces 5,但我懷疑這個功能已經在那裏了。所以你需要爲自己編寫一些代碼。

尋找一個在Richfaces 4 showcase about table sorting需要

  • 把你的託管bean到ViewScope - 否則無序列表將被一次又一次地
  • 創建移動你loadDataListgetDataList()到constuctor或註釋它@PostConstruct - 否則無序列表將再次創建並再次
  • 讓你TaskListData序列化
  • 添加排序方法您TaskListBean - 做排序有 - 你叫它manager,但在你的XHTML你怎麼稱呼它的代碼TaskListBean

這裏是我的關注 - 也許在Sort ArrayList of custom Objects by property

  • 檢查描述你的ManagedBean TaskListBeanname您的XHTML版本

    <f:view> 
        <h:head /> 
        <h:body> 
         <h:form> 
          <rich:dataTable id="table" var="dataItem" 
           value="#{manager.dataList}" width="350"> 
    
           <rich:column id="ticketId" sortBy="#{dataItem.taskInstanceId}"> 
            <f:facet name="header"> 
             <a4j:commandLink value="Ticket Id" render="table" 
              action="#{manager.sortBy('Ticket Id')}" /> 
            </f:facet> 
            <h:outputText value="#{dataItem.taskInstanceId}" /> 
           </rich:column> 
    
           <rich:column sortBy="#{dataItem.taskNode}"> 
            <f:facet name="header"> 
             <a4j:commandLink value="Status" render="table" 
              action="#{manager.sortBy('Status')}" /> 
            </f:facet> 
            <h:outputText value="#{dataItem.taskNode}" /> 
           </rich:column> 
    
           <rich:column sortBy="#{dataItem.actorId}"> 
            <f:facet name="header"> 
             <a4j:commandLink value="Actor" render="table" 
              action="#{manager.sortBy('Actor')}" /> 
            </f:facet> 
            <h:outputText value="#{dataItem.actorId}" /> 
           </rich:column> 
    
           <rich:column> 
            <f:facet name="header"> 
             <a4j:commandLink value="Description" render="table" 
              action="#{manager.sortBy('Description')}" /> 
            </f:facet> 
            <h:outputText value="#{dataItem.description}" /> 
           </rich:column> 
    
          </rich:dataTable> 
         </h:form> 
        </h:body> 
    </f:view> 
    

    我的你TaskListBean

    import java.io.Serializable; 
    import java.util.*; 
    
    import javax.annotation.PostConstruct; 
    import javax.faces.bean.*; 
    
    @ViewScoped 
    @ManagedBean(name="manager") 
    public class TaskListBean implements Serializable { 
    
        private ArrayList<TaskListData> dataList; 
    
        @PostConstruct 
        public void loadDataList() { 
         dataList = new ArrayList<TaskListData>(); 
    
         TaskListData data1 = new TaskListData(); 
         data1.setTaskInstanceId(1000l); 
         data1.setActorId("Willy smith"); 
         data1.setTaskNode("In Charge"); 
         data1.setDescription("CR 123456"); 
    
         TaskListData data2 = new TaskListData(); 
         data2.setTaskInstanceId(1001l); 
         data2.setActorId("Frank Sinatra"); 
         data2.setTaskNode("Rejected"); 
         data2.setDescription("CR 654321"); 
    
         dataList.add(data1); 
         dataList.add(data2); 
    
        } 
    
        public void sortBy(String aColumn) { 
         System.out.println("sort by: " + aColumn); 
         // TODO sort the list by that attribute 
        } 
    
        public List<TaskListData> getDataList() { 
         return dataList; 
        } 
    
    } 
    
    調整版本