Primefaces Datatable有許多選項可用於排列分頁。 我有一個要求,使分頁程序,如下面的圖片:如何在Primefaces數據表中自定義分頁表
任何一個是否有任何想法如何做到這一點。如果您知道,請建議其他方式。
Primefaces Datatable有許多選項可用於排列分頁。 我有一個要求,使分頁程序,如下面的圖片:如何在Primefaces數據表中自定義分頁表
任何一個是否有任何想法如何做到這一點。如果您知道,請建議其他方式。
擴展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>
我不認爲有一個簡單的方法來實現你想要的。目前的p:dataTable
的分頁程序模板支持以下選項:
查看類org.primefaces.renderkit.DataRenderer
的源代碼,您可以使用這些選項。開發自定義數據表或通過修改源代碼需要做什麼。 Primefaces目前沒有它。
嘗試使用{RowsPerPageDropdown} of {totalPage}
反而延長了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}" />
此替代其他選項的優點是:
但是需要額外的java代碼。
注意應該是自從PrimeFaces 5.2以來這是新的,並且在舊版本中是不可能的。 – BalusC 2015-09-29 07:47:55
JSF ApplicationFactory實現中的靜態方法:意味着什麼? – 2015-10-07 12:47:59
@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
它工作的PageLinks,直到我點擊其中一個按鈕 – 2015-07-24 12:21:37
任何機會擴大此答案,以便改變頁面後自定義代碼不會消失嗎?或者如何將onclick事件附加到頁碼號鏈接上的以外的其他標籤。 – 2015-11-12 14:27:24