我想使用分页来显示表格页面。这原则上可行,但我想添加与默认分页导航位于同一行的其他控件:
- 用于转到第一页的按钮(“<<”)
- 用于跳转到指定页面索引的文本字段
- 用于转到最后一页的按钮(“>>”)
- 每页条目数的文本字段
- 搜索文本字段以跳转到包含具有给定 ID 的行条目的页面。
我可以使用 setPageFactory() 方法自定义分页控件上方的页面,但我无法自定义导航控件本身。怎么做?如果我在默认导航上方或下方添加附加控件,则会浪费一些空间:
最佳答案
不支持自定义导航控件。等待期间the enhancement request要修复此问题,我们可以应用如下所述的黑客攻击(如果 QA 指南允许)。这是一个 hack,因为与导航控件相关的所有内容都是 PaginationSkin 中的私有(private)包,而 PaginationSkin 本身还不是公共(public) api。
基本思想是将附加节点插入到核心导航控件中,这显然意味着依赖实现细节(不要,不要,不要:-)。我们在实例化时以及每当再次插入下一个按钮时即时执行此操作 - 在分页的布局和状态更改期间,核心经常清除其所有子项。这涉及到:
- 查找包含按钮的 Pane ,它的选择器是control-box
- 保留对其最后一个子项的引用,即下一个按钮
- 向 Pane 的子项添加监听器,以便能够插入自定义控件
自定义皮肤的代码示例,这里只有两个按钮用于第一个/最后一个:
public static class CustomPaginationSkin extends PaginationSkin {
private HBox controlBox;
private Button prev;
private Button next;
private Button first;
private Button last;
private void patchNavigation() {
Pagination pagination = getSkinnable();
Node control = pagination.lookup(".control-box");
if (!(control instanceof HBox))
return;
controlBox = (HBox) control;
prev = (Button) controlBox.getChildren().get(0);
next = (Button) controlBox.getChildren().get(controlBox.getChildren().size() - 1);
first = new Button("A");
first.setOnAction(e -> {
pagination.setCurrentPageIndex(0);
});
first.disableProperty().bind(
pagination.currentPageIndexProperty().isEqualTo(0));
last = new Button("Z");
last.setOnAction(e -> {
pagination.setCurrentPageIndex(pagination.getPageCount());
});
last.disableProperty().bind(
pagination.currentPageIndexProperty().isEqualTo(
pagination.getPageCount() - 1));
ListChangeListener childrenListener = c -> {
while (c.next()) {
// implementation detail: when nextButton is added, the setup is complete
if (c.wasAdded() && !c.wasRemoved() // real addition
&& c.getAddedSize() == 1 // single addition
&& c.getAddedSubList().get(0) == next) {
addCustomNodes();
}
}
};
controlBox.getChildren().addListener(childrenListener);
addCustomNodes();
}
protected void addCustomNodes() {
// guarding against duplicate child exception
// (some weird internals that I don't fully understand...)
if (first.getParent() == controlBox) return;
controlBox.getChildren().add(0, first);
controlBox.getChildren().add(last);
}
/**
* @param pagination
*/
public CustomPaginationSkin(Pagination pagination) {
super(pagination);
patchNavigation();
}
}
关于java - 如何扩展 JavaFX 分页导航以显示附加控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31540001/