JavaFX分页

时间:2020-01-09 10:36:39  来源:igfitidea点击:

JavaFX分页控件使用户可以逐页浏览内容,例如搜索结果,文章,图像或者类似类型内容的页面。 JavaFX分页控件由类javafx.scene.control.Pagination表示。这是JavaFXPagination控件的屏幕截图:

全分页示例

这是第一个完整的Java代码示例,说明如何使用JavaFXPagination控件:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.Pagination;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;

public class PaginationExample extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("JavaFX App");

        Pagination pagination = new Pagination();
        pagination.setPageCount(21);
        pagination.setCurrentPageIndex(3);
        pagination.setMaxPageIndicatorCount(3);

        pagination.setPageFactory((pageIndex) -> {

            Label label1 = new Label("Content for page with index: " + pageIndex);
            label1.setFont(new Font("Arial", 24));

            Label label2 = new Label("Main content of the page ...");

            return new VBox(label1, label2);
        });

        VBox vBox = new VBox(pagination);
        Scene scene = new Scene(vBox, 960, 600);

        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

分页属性

JavaFX的Pagination控件包含一组属性,这些属性指定如何呈现Pagination控件。这些属性是:

  • 页数
  • 当前页面索引
  • 页面指示符最大数量

页面数是用户可以浏览的页面总数。当前页面索引是用户当前正在查看的页面。页面指示符的最大数量是带有页面编号的快捷按钮的数量,用户可以单击这些快捷按钮直接导航到该页面。

这三个属性的效果在本教程前面的屏幕快照中都是可见的。这是设置所有三个属性的示例:

Pagination pagination = new Pagination();

pagination.setPageCount(21);
pagination.setCurrentPageIndex(3);
pagination.setMaxPageIndicatorCount(3);

分页页面工厂

JavaFX"分页"控件需要在其上设置页面工厂,以便能够正确浏览页面内容。当用户导航到新页面时,将调用页面工厂。页面工厂组件通过其setPageFactory()方法连接到Pagination控件,并且必须实现javafx.util.Callback接口。

首先是如何定义" CallBack"接口:

public interface Callback<P,R> {

    public R call(P param);

}

在setPageFactory()方法中,两个类型参数P和R设置为Integer(P)和Node(R)。这意味着页面工厂必须实现Callback &lt;Integer,Node>接口。这是Callback &lt;Integer,Node>的实现示例:

public static class MyPageFactory implements Callback<Integer, Node> {
    @Override
    public Node call(Integer pageIndex) {
        return new Label("Content for page " + pageIndex);
    }
}

传递给Callback实现的Integer参数是页面工厂应为其创建Node的页面的索引。返回的"节点"应显示具有给定页面索引的页面内容。

这是在JavaFXPagination控件上设置页面工厂的示例:

pagination.setPageFactory(new MyPageFactory());

我们还可以使用匿名Callback接口实现或者Java lambda表达式在Pagination控件上设置页面工厂。这首先是一个使用匿名Callback实现的示例:

pagination.setPageFactory(new Callback<Integer, Node>() {
    @Override
    public Node call(Integer pageIndex) {
        return new Label("Content for page " + pageIndex);
    }
});

这是一个使用Java Lambda表达式设置Pagination页面工厂的示例:

pagination.setPageFactory((pageIndex) -> {
   return new Label("Content for page " + pageIndex);
});

甚至更短,使用更短的lambda表达式语法:

pagination.setPageFactory((pageIndex) -> new Label("Content for page " + pageIndex) );