java - 如何扩展 JavaFX 分页导航以显示附加控件?

标签 java layout pagination javafx-8

我想使用分页来显示表格页面。这原则上可行,但我想添加与默认分页导航位于同一行的其他控件:

  • 用于转到第一页的按钮(“<<”)
  • 用于跳转到指定页面索引的文本字段
  • 用于转到最后一页的按钮(“>>”)
  • 每页条目数的文本字段
  • 搜索文本字段以跳转到包含具有给定 ID 的行条目的页面。

我可以使用 setPageFactory() 方法自定义分页控件上方的页面,但我无法自定义导航控件本身。怎么做?如果我在默认导航上方或下方添加附加控件,则会浪费一些空间:

enter image description here

相关文章: JavaFX Pagination, adding << and >>> options

提交了 enhancement request

最佳答案

不支持自定义导航控件。等待期间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/

相关文章:

asp.net - 默认为 ListView 中的最后一页

python - Flask-paginate 在一页上显示所有结果

javascript - 通量分页

java - 我可以在远程/本地接口(interface)中使用继承吗? (EJB3)

java - 我是构造函数新手,我如何为字符串传递 int ?

java - JEdi​​torPane 中的超链接无法在 MAC 上打开

jquery - 当使用 JQuery UI 可调整大小调整其容器大小时,想要自动调整 jQuery UI.Layout 的 div 宽度和高度!

Android 布局 - 具有相同位置的 UI 对象

java - 如何在WebView中加载新文件?

java - 如何根据 TextView 的长度对齐它