Primefaces Datatable有很多选项来安排分页。我需要将Paginator设置为以下图片中的样式:
如果您知道如何实现,请提供建议。如果您知道任何替代方法,请提出建议。
Primefaces Datatable有很多选项来安排分页。我需要将Paginator设置为以下图片中的样式:
如果您知道如何实现,请提供建议。如果您知道任何替代方法,请提出建议。
扩展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.
}
}
(您可以在扩展自 DataRenderer
类的源代码中找到该方法)
然后,要使其运行,请在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>
不必像上面建议的那样扩展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");
}
}
<p:dataTable paginatorTemplate="{myPaginator}" />
。addPaginatorElement
仅一次。通过扩展 OmniFaces 应用工厂的一个简单示例可以是:public class MyApplicationFactory extends OmniApplicationFactory {
/* 构造函数省略 */
@Override public Application getApplication() {
org.primefaces.renderkit.DataRenderer.addPaginatorElement("{myPaginator}", new MyPaginatorImplementation());
return super.getApplication(); } }
- Frederieke Scheper我认为没有简单的方法可以实现你想要的功能。目前,p:dataTable
的分页模板支持以下选项:
查看类org.primefaces.renderkit.DataRenderer
的源代码,您可以使用这些选项。如果您想要的是自定义数据表或修改源代码,那么您需要这样做。Primefaces目前不支持此功能。
尝试使用{RowsPerPageDropdown} / {totalPage}