javafx自定义分页控件的实现

时间:2024-05-20 14:02:54

由于javafx自带的分页控件太小,自己又不会改javafx分页控件的大小只能自己花了多半天的时间简单的写了一个分页控件,可实现选中的按钮一直再中间效果图如下:

javafx自定义分页控件的实现

javafx自定义分页控件的实现

 

 

 

话不多说代码如下:

package util;
import javafx.scene.control.Button;
import javafx.scene.layout.HBox;
public class PagingUtil {
    //当前页
    private static int currentPage=1;
    //总页数
    private static int pageCount=10;
    //每页显示条数
    private static int showPageNumber=5;
    //上一页下一页按钮
    private static Button previousPage,nextPage;
    //存放页的HBox
    private static HBox pageHBox=new HBox(20);
    //页数改变监听
    private static OnPageListener listener;


    /**
     * 刷新分页控件
     * @param pageCount 总页数
     */
    public static void reset(int pageCount){
        currentPage=1;
        PagingUtil.pageCount=pageCount;
        setShowPage();
    }


    /**
     * 页数控件初始化
     * @return HBox
     */
    public static HBox getPaging(){
        HBox hBox=new HBox(20);
        previousPage=new Button("上一页");
        previousPage.setStyle("-fx-background-radius: 10px");
        nextPage=new Button("下一页");
        nextPage.setStyle("-fx-background-radius: 10px");
        setShowPage();
        hBox.getChildren().addAll(previousPage,pageHBox,nextPage);
        //上一页下一页按钮的监听
        nextPage.setOnAction(np->{
            currentPage++;
            setShowPage();
            listener.update(currentPage);
        });
        previousPage.setOnAction(pp->{
            currentPage--;
            setShowPage();
            listener.update(currentPage);
        });
        return hBox;
    }

    /**
     * 改变页数
     */
    private static void setShowPage(){
        pageHBox.getChildren().clear();
        if (currentPage==1){
            previousPage.setDisable(true);
            nextPage.setDisable(false);
        }else if(currentPage==pageCount){
            previousPage.setDisable(false);
            nextPage.setDisable(true);
        }else {
            previousPage.setDisable(false);
            nextPage.setDisable(false);
        }
        //判断是否是第一页并且只有一页
        if (currentPage-3<=0&&pageCount<=showPageNumber){
            //设置上一页和下一页不可点击
            for (int i = 0; i < pageCount; i++) {
                Button button=new Button((i+1)+"");
                //判断是否是当前页
                if(currentPage-i==1){
                    button.setStyle("-fx-background-radius: 20px;-fx-background-color: #ffffcc");
                    //设置当前页不可点击
                    button.setDisable(true);
                }else{
                    button.setStyle("-fx-background-radius: 20px;");
                }
                button.setOnAction(bu->{
                    Button b= (Button) bu.getSource();
                    currentPage=Integer.parseInt(b.getText());
                    setShowPage();
                    listener.update(currentPage);
                });
                pageHBox.getChildren().add(button);
            }
        }else if(currentPage-3<=0){
            for (int i = 0; i < showPageNumber; i++) {
                Button button=new Button((i+1)+"");
                //判断是否是当前页
                if(currentPage-i==1){
                    button.setStyle("-fx-background-radius: 20px;-fx-background-color: #ffffcc");
                    //设置当前页不可点击
                    button.setDisable(true);
                }else{
                    button.setStyle("-fx-background-radius: 20px;");
                }
                button.setOnAction(bu->{
                    Button b= (Button) bu.getSource();
                    currentPage=Integer.parseInt(b.getText());
                    setShowPage();
                    listener.update(currentPage);
                });
                pageHBox.getChildren().add(button);
            }
        }else if(currentPage+3>pageCount){
            //如果当前页加3大于总页数 则循环起点为pageCount-showPageNumber 终点为pageCount
            for (int i = pageCount-showPageNumber; i < pageCount; i++) {
                Button button=new Button((i+1)+"");
                //判断是否是当前页
                if(currentPage-i==1){
                    button.setStyle("-fx-background-radius: 20px;-fx-background-color: #ffffcc");
                    //设置当前页不可点击
                    button.setDisable(true);
                }else{
                    button.setStyle("-fx-background-radius: 20px;");
                }
                button.setOnAction(bu->{
                    Button b= (Button) bu.getSource();
                    currentPage=Integer.parseInt(b.getText());
                    setShowPage();
                    listener.update(currentPage);
                });
                pageHBox.getChildren().add(button);
            }
        }else{
            //如果上面条件都不是则是正常页设置上下页都可以点击
            for (int i = currentPage-3; i < currentPage+2; i++) {
                Button button=new Button((i+1)+"");
                //判断是否是当前页
                if(currentPage-i==1){
                    button.setStyle("-fx-background-radius: 20px;-fx-background-color: #ffffcc");
                    //设置当前页不可点击
                    button.setDisable(true);
                }else{
                    button.setStyle("-fx-background-radius: 20px;");
                }
                button.setOnAction(bu->{
                    Button b= (Button) bu.getSource();
                    currentPage=Integer.parseInt(b.getText());
                    setShowPage();
                    listener.update(currentPage);
                });
                pageHBox.getChildren().add(button);
            }
        }
    }


    public interface OnPageListener{
        void update(int page);
    }

    public static void setOnPageListener(OnPageListener listener){
        PagingUtil.listener =listener;
    }
}

使用的时候只需要直接调用即可返回HBox,然后实现监听页数改变的接口即可,代码如下:

package sample;

import javafx.application.Application;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
import util.PagingUtil;

public class PagingDemo extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception {
        AnchorPane an=new AnchorPane();
        HBox hBox= PagingUtil.getPaging();
        Button button=new Button("button");
        an.getChildren().addAll(hBox,button);
        AnchorPane.setTopAnchor(button,100.0);
        Scene scene = new Scene(an);
        primaryStage.setScene(scene);
        primaryStage.setWidth(800);
        primaryStage.setHeight(800);
        primaryStage.show();
        PagingUtil.setOnPageListener(new PagingUtil.OnPageListener() {
            @Override
            public void update(int page) {
                System.out.println(page);
            }
        });
        button.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                PagingUtil.reset(5);
            }
        });
    }


    public static void main(String[] args) {
        launch(args);
    }
}

还有很多需要完善的地方,由于本人只需要每页显示5条,所以你们懂得哈哈哈哈!!有特殊需求的再自己完善吧!!