2013-03-11 31 views

回答

9

擴展PrimeFaces DataTableRenderer並覆蓋encodePaginatorMarkup()

import org.primefaces.component.datatable.DataTableRenderer; 

public class MyDataTableRenderer extends DataTableRenderer { 

    @Override 
    protected void encodePaginatorMarkup(FacesContext context, DataTable table, String position, String tag, String styleClass) throws IOException { 
     // Copypaste here the original PF source code and make modifications where necessary. 
    } 

} 

(你可以找到源代碼的方法the DataRenderer class它是從擴展)

然後,讓它運行,註冊如下faces-config.xml

<render-kit> 
    <renderer> 
     <description>Overrides the PrimeFaces table renderer with customized paginator.</description> 
     <component-family>org.primefaces.component</component-family> 
     <renderer-type>org.primefaces.component.DataTableRenderer</renderer-type> 
     <renderer-class>com.example.MyDataTableRenderer</renderer-class> 
    </renderer> 
</render-kit> 
+0

它工作的PageLinks,直到我點擊其中一個按鈕 – 2015-07-24 12:21:37

+0

任何機會擴大此答案,以便改變頁面後自定義代碼不會消失嗎?或者如何將onclick事件附加到頁碼號鏈接上的以外的其他標籤。 – 2015-11-12 14:27:24

0

我不認爲有一個簡單的方法來實現你想要的。目前的p:dataTable的分頁程序模板支持以下選項:

  1. CurrentPageReport
  2. FirstPageLink
  3. PreviousPageLink
  4. NextPageLink
  5. LastPageLink
  6. PageLinks
  7. RowsPerPageDropdown
  8. JumpToPageDropdown

查看類org.primefaces.renderkit.DataRenderer的源代碼,您可以使用這些選項。開發自定義數據表或通過修改源代碼需要做什麼。 Primefaces目前沒有它。

0

嘗試使用{RowsPerPageDropdown} of {totalPage}

4

反而延長了PrimeFaces的DataTableRenderer和壓倒一切的encodePaginatorMarkup()按照以上建議,你可以自己的org.primefaces.component.paginator.PaginatorElementRenderer的實施添加到標準集支持分頁程序元素。

這可以通過調用下面的靜態方法在JSF ApplicationFactory實現來實現:

org.primefaces.renderkit.DataRenderer.addPaginatorElement("{myPaginator}", new MyPaginatorImplementation()); 

隨後你需要添加MyPaginatorImplementation類,它必須實現接口org.primefaces.component.paginator.PaginatorElementRenderer。作爲起點,您可以從PrimeFaces PageLinksRenderer類開始您的定製,例如,

public class MyPaginatorImplementation implements PaginatorElementRenderer { 

    public void render(FacesContext context, UIData uidata) throws IOException { 
     ResponseWriter writer = context.getResponseWriter(); 
     int currentPage = uidata.getPage(); 
     int pageLinks = uidata.getPageLinks(); 
     int pageCount = uidata.getPageCount(); 
     int visiblePages = Math.min(pageLinks, pageCount); 

     //calculate range, keep current in middle if necessary 
     int start = Math.max(0, (int) Math.ceil(currentPage - ((visiblePages)/2))); 
     int end = Math.min(pageCount - 1, start + visiblePages - 1); 

     //check when approaching to last page 
     int delta = pageLinks - (end - start + 1); 
     start = Math.max(0, start - delta); 

     writer.startElement("span", null); 
     writer.writeAttribute("class", UIData.PAGINATOR_PAGES_CLASS, null); 

     for(int i = start; i <= end; i++){ 
      String styleClass = currentPage == i ? UIData.PAGINATOR_ACTIVE_PAGE_CLASS : UIData.PAGINATOR_PAGE_CLASS; 

      writer.startElement("span", null); 
      writer.writeAttribute("class", styleClass, null); 
      writer.writeAttribute("tabindex", 0, null); 
      writer.writeText((i + 1), null); 
      writer.endElement("span"); 
     } 

     writer.endElement("span"); 
    } 
} 

現在,您可以使用PrimeFaces提供的標準方式在您的XHTML中使用它,例如,

<p:dataTable paginatorTemplate="{myPaginator}" />

此替代其他選項的優點是:

  • 可以使用在UIData元素中的信息(如在第一和最後顯示行)。這在datalist/datatable中的自定義構面中不可用。
  • 您可以在應用程序中的每個數據表和/或數據列表中重複使用它,從而防止在xhtml中重複編寫模板。

但是需要額外的java代碼。

+2

注意應該是自從PrimeFaces 5.2以來這是新的,並且在舊版本中是不可能的。 – BalusC 2015-09-29 07:47:55

+0

JSF ApplicationFactory實現中的靜態方法:意味着什麼? – 2015-10-07 12:47:59

+0

@Rajesh很簡單:你需要一個鉤子來調用方法'addPaginatorElement'一次。通過擴展OmniFaces應用程序工廠的一個簡單示例可能是: 'public class MyApplicationFactory extends OmniApplicationFactory {' '/ * constructor ignored * /' '@Override public Application getApplication(){' 'org.primefaces.renderkit.DataRenderer .addPaginatorElement(「{myPaginator}」,new MyPaginatorImplementation());' 'return super.getApplication(); }}' – 2015-10-09 08:14:42