添加分页,及其回调函数

master
qmstyle 2025-03-14 16:17:08 +08:00
parent 7a34bb898b
commit 5fcdc77d41
13 changed files with 245 additions and 30 deletions

View File

@ -50,6 +50,12 @@
<version>1.2.83</version> <version>1.2.83</version>
</dependency> </dependency>
<dependency>
<groupId>Freedom-Mr</groupId>
<artifactId>JavaFx-PaginationPicker</artifactId>
<version>0.0.2</version>
</dependency>
</dependencies> </dependencies>
<build> <build>

View File

@ -25,9 +25,6 @@ public class OnlineExamApplication extends Application {
stage.setResizable(false); stage.setResizable(false);
stage.setTitle("在线考试系统"); stage.setTitle("在线考试系统");
stage.show(); stage.show();
} }

View File

@ -0,0 +1,13 @@
package com.zhangmeng.online.exam.ui.admin;
import javafx.scene.layout.AnchorPane;
/**
* @author zm
* @date 2025/3/14 12:13
* @version: 1.0
*/
public class HomePage extends AnchorPane {
}

View File

@ -37,7 +37,7 @@ public class IndexPage extends BorderPane {
this.setLeft(sideMenu); this.setLeft(sideMenu);
this.setCenter(contentArea); this.setCenter(contentArea);
this.setTop(top); // this.setTop(top);
} }
} }

View File

@ -7,6 +7,8 @@ import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.zhangmeng.online.exam.ui.api.model.UserDataLoad;
import com.zhangmeng.online.exam.ui.components.callBack.DynamicTableComponentCallBack;
import com.zhangmeng.online.exam.ui.layouts.SideMenu; import com.zhangmeng.online.exam.ui.layouts.SideMenu;
import com.zhangmeng.online.exam.ui.utils.HttpUtils; import com.zhangmeng.online.exam.ui.utils.HttpUtils;
import javafx.beans.property.SimpleMapProperty; import javafx.beans.property.SimpleMapProperty;
@ -52,21 +54,8 @@ public class ApiUtils {
} }
public static DataView getUserList() { public static DataView getUserList() {
String userListData = HttpUtils.GET(API_URL + "/user/list"); DataLoad dataLoad = new UserDataLoad();
JSONObject jsonObject = JSON.parseObject(userListData); return dataLoad.loadData(1,10);
JSONArray data = jsonObject.getJSONArray("data");
List<Map<String, SimpleStringProperty>> userMapList = new ArrayList<>();
for (Object datum : data) {
JSONObject user = (JSONObject) datum;
Map<String, SimpleStringProperty> userMap = new HashMap<>();
userMap.put("序号", new SimpleStringProperty(user.getString("id")));
userMap.put("用户名", new SimpleStringProperty(user.getString("username")));
userMap.put("电子邮箱", new SimpleStringProperty(user.getString("email")));
userMap.put("手机号码", new SimpleStringProperty(user.getString("phone")));
userMapList.add(userMap);
}
return new DataView(Arrays.asList("序号", "用户名", "电子邮箱", "手机号码"), userMapList);
} }
public static DataView getRoleList() { public static DataView getRoleList() {
@ -130,6 +119,62 @@ public class ApiUtils {
private List<Map<String, SimpleStringProperty>> dataList; private List<Map<String, SimpleStringProperty>> dataList;
private Integer pageNum;
private Integer pageSize;
private Integer total;
private DynamicTableComponentCallBack callBack;
private DataLoad dataLoad;
public DataLoad getDataLoad() {
return dataLoad;
}
public void setDataLoad(DataLoad dataLoad) {
this.dataLoad = dataLoad;
}
public DynamicTableComponentCallBack getCallBack() {
return callBack;
}
public void setCallBack(DynamicTableComponentCallBack callBack) {
this.callBack = callBack;
}
public DataView(List<String> keys, List<Map<String, SimpleStringProperty>> dataList, Integer pageNum, Integer pageSize, Integer total) {
this.keys = keys;
this.dataList = dataList;
this.pageNum = pageNum;
this.pageSize = pageSize;
this.total = total;
}
public Integer getPageNum() {
return pageNum;
}
public void setPageNum(Integer pageNum) {
this.pageNum = pageNum;
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
public Integer getTotal() {
return total;
}
public void setTotal(Integer total) {
this.total = total;
}
public DataView(List<String> keys, List<Map<String, SimpleStringProperty>> dataList) { public DataView(List<String> keys, List<Map<String, SimpleStringProperty>> dataList) {
this.keys = keys; this.keys = keys;
this.dataList = dataList; this.dataList = dataList;

View File

@ -0,0 +1,16 @@
package com.zhangmeng.online.exam.ui.api;
import javafx.beans.property.SimpleStringProperty;
import java.util.List;
import java.util.Map;
/**
* @author zm
* @date 2025/3/14 15:48
* @version: 1.0
*/
public interface DataLoad {
public ApiUtils.DataView loadData(Integer pageNum, Integer pageSize);
}

View File

@ -0,0 +1,43 @@
package com.zhangmeng.online.exam.ui.api.model;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.zhangmeng.online.exam.ui.api.DataLoad;
import com.zhangmeng.online.exam.ui.utils.HttpUtils;
import javafx.beans.property.SimpleStringProperty;
import java.util.*;
import com.zhangmeng.online.exam.ui.api.ApiUtils;
/**
* @author zm
* @date 2025/3/14 16:01
* @version: 1.0
*/
public class UserDataLoad implements DataLoad {
@Override
public ApiUtils.DataView loadData(Integer pageNum, Integer pageSize) {
Map<String, Object> params = new HashMap<>();
params.put("pageNum", pageNum.toString());
params.put("pageSize", pageSize.toString());
String userListData = HttpUtils.GET(ApiUtils.API_URL + "/user/list",params);
JSONObject jsonObject = JSON.parseObject(userListData);
JSONArray data = jsonObject.getJSONArray("data");
List<Map<String, SimpleStringProperty>> userMapList = new ArrayList<>();
for (Object datum : data) {
JSONObject user = (JSONObject) datum;
Map<String, SimpleStringProperty> userMap = new HashMap<>();
userMap.put("序号", new SimpleStringProperty(user.getString("id")));
userMap.put("用户名", new SimpleStringProperty(user.getString("username")));
userMap.put("电子邮箱", new SimpleStringProperty(user.getString("email")));
userMap.put("手机号码", new SimpleStringProperty(user.getString("phone")));
userMapList.add(userMap);
}
ApiUtils.DataView dataView = new ApiUtils.DataView(Arrays.asList("序号", "用户名", "电子邮箱", "手机号码"), userMapList);
dataView.setDataLoad(this);
return dataView;
}
}

View File

@ -1,17 +1,28 @@
package com.zhangmeng.online.exam.ui.components; package com.zhangmeng.online.exam.ui.components;
import com.zhangmeng.online.exam.ui.api.ApiUtils;
import com.zhangmeng.online.exam.ui.components.callBack.DynamicTableComponentCallBack;
import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections; import javafx.collections.FXCollections;
import javafx.collections.ObservableList; import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.Pagination;
import javafx.scene.control.TableColumn; import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView; import javafx.scene.control.TableView;
import javafx.scene.control.cell.MapValueFactory; import javafx.scene.control.cell.MapValueFactory;
import javafx.scene.control.cell.TextFieldTableCell; import javafx.scene.control.cell.TextFieldTableCell;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox; import javafx.scene.layout.VBox;
import org.casic.javafx.control.PaginationPicker;
import java.util.*; import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import static cn.hutool.poi.word.TableUtil.createTable;
/** /**
* *
* *
@ -20,10 +31,24 @@ import java.util.concurrent.atomic.AtomicBoolean;
* @version: 1.0 * @version: 1.0
*/ */
public class DynamicTableComponent extends VBox { public class DynamicTableComponent extends VBox {
private DynamicTableComponentCallBack callBack;
public DynamicTableComponentCallBack getCallBack() {
return callBack;
}
public void setCallBack(DynamicTableComponentCallBack callBack) {
this.callBack = callBack;
}
private final ObservableList<Map<String, SimpleStringProperty>> data = FXCollections.observableArrayList(); private final ObservableList<Map<String, SimpleStringProperty>> data = FXCollections.observableArrayList();
public DynamicTableComponent(List<Map<String, SimpleStringProperty>> dataList,List<String> keys) { // public DynamicTableComponent(List<Map<String, SimpleStringProperty>> dataList,List<String> keys) {
public DynamicTableComponent(ApiUtils.DataView dataView) {
super(); super();
List<Map<String, SimpleStringProperty>> dataList = dataView.getDataList();
List<String> keys =dataView.getKeys();
TableView<Map<String, SimpleStringProperty>> tableView = new TableView<>(); TableView<Map<String, SimpleStringProperty>> tableView = new TableView<>();
tableView.setItems(data); tableView.setItems(data);
tableView.setEditable(true); tableView.setEditable(true);
@ -53,6 +78,25 @@ public class DynamicTableComponent extends VBox {
}); });
data.addAll(dataList); data.addAll(dataList);
this.getChildren().addAll(tableView); this.getChildren().addAll(tableView);
//初始化一个分页
PaginationPicker paginationPicker = new PaginationPicker();
paginationPicker.setTotal(dataView.getTotal());//设置总数据量默认0
paginationPicker.setPageSize(dataView.getPageSize());//设置每页显示条数默认30
paginationPicker.setPageButtonCount(9);//设置页码按钮的数量默认7当总页数超过该值时会折叠大于等于 5 且小于等于 21 的奇数
paginationPicker.setCurrentPage(dataView.getPageNum());//设置当前选择页码默认第一页注意必须放在所有设置条件之后。不小于0 并且 不大于总页数
paginationPicker.setPaginationButtonFontSize(12);//设置分页字体大小默认10(不小于2)
//监听点击动作事件
paginationPicker.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
// System.out.println("当前选择页码:"+paginationPicker.getCurrentPage());
data.clear();
data.addAll(callBack.flushData(paginationPicker.getCurrentPage(),paginationPicker.getPageSize()).getDataList());
}
});
this.getChildren().add(paginationPicker);
} }
} }

View File

@ -0,0 +1,19 @@
package com.zhangmeng.online.exam.ui.components.callBack;
import com.zhangmeng.online.exam.ui.api.ApiUtils;
import com.zhangmeng.online.exam.ui.api.DataLoad;
import javafx.beans.property.SimpleStringProperty;
import java.util.List;
import java.util.Map;
/**
* @author zm
* @date 2025/3/14 15:34
* @version: 1.0
*/
public interface DynamicTableComponentCallBack {
public ApiUtils.DataView flushData(Integer pageNum, Integer pageSize);
}

View File

@ -0,0 +1,27 @@
package com.zhangmeng.online.exam.ui.components.callBack;
import com.zhangmeng.online.exam.ui.api.ApiUtils;
import com.zhangmeng.online.exam.ui.api.DataLoad;
import javafx.beans.property.SimpleStringProperty;
import java.util.List;
import java.util.Map;
/**
* @author zm
* @date 2025/3/14 15:35
* @version: 1.0
*/
public class DynamicTableComponentCallBackImpl implements DynamicTableComponentCallBack {
private DataLoad dataLoad;
public DynamicTableComponentCallBackImpl(DataLoad dataLoad) {
this.dataLoad = dataLoad;
}
@Override
public ApiUtils.DataView flushData(Integer pageNum, Integer pageSize) {
// System.out.println("刷新数据:" + pageNum + " " + pageSize);
return dataLoad.loadData(pageNum, pageSize);
}
}

View File

@ -4,6 +4,7 @@ import com.zhangmeng.online.exam.ui.admin.IndexPage;
import com.zhangmeng.online.exam.ui.api.ApiUtils; import com.zhangmeng.online.exam.ui.api.ApiUtils;
import com.zhangmeng.online.exam.ui.components.DynamicTableComponent; import com.zhangmeng.online.exam.ui.components.DynamicTableComponent;
import com.zhangmeng.online.exam.ui.components.ShortAnswerComponent; import com.zhangmeng.online.exam.ui.components.ShortAnswerComponent;
import com.zhangmeng.online.exam.ui.components.callBack.DynamicTableComponentCallBackImpl;
import javafx.beans.property.SimpleMapProperty; import javafx.beans.property.SimpleMapProperty;
import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ChangeListener; import javafx.beans.value.ChangeListener;
@ -163,9 +164,13 @@ public class SideMenu extends VBox {
private void init_table(HBox hbox, ApiUtils.DataView dataView) { private void init_table(HBox hbox, ApiUtils.DataView dataView) {
Scene scene = hbox.getScene(); Scene scene = hbox.getScene();
IndexPage root = (IndexPage) scene.getRoot(); IndexPage root = (IndexPage) scene.getRoot();
DynamicTableComponent shortAnswerComponent = new DynamicTableComponent(dataView.getDataList(), dataView.getKeys()); dataView.setPageNum(1);
shortAnswerComponent.setPadding(new Insets(15)); dataView.setPageSize(10);
shortAnswerComponent.prefHeightProperty().bind(root.heightProperty().subtract(15)); dataView.setTotal(100);
root.setCenter(shortAnswerComponent); DynamicTableComponent dynamicTableComponent = new DynamicTableComponent(dataView);
dynamicTableComponent.setCallBack(new DynamicTableComponentCallBackImpl(dataView.getDataLoad()));
dynamicTableComponent.setPadding(new Insets(15));
dynamicTableComponent.prefHeightProperty().bind(root.heightProperty().subtract(15));
root.setCenter(dynamicTableComponent);
} }
} }

View File

@ -28,9 +28,8 @@ public class HttpUtils<T> {
return HttpUtil.get(url, CharsetUtil.CHARSET_UTF_8); return HttpUtil.get(url, CharsetUtil.CHARSET_UTF_8);
} }
public static <T> T GET(String url, Map<String, Object> params, Class<T> clazz) { public static String GET(String url, Map<String, Object> params) {
String response = HttpUtil.get(url, params); return HttpUtil.get(url, params);
return JSONObject.parseObject(response, clazz);
} }
public static <T> T POST(String url, Map<String, Object> params, Class<T> clazz) { public static <T> T POST(String url, Map<String, Object> params, Class<T> clazz) {

View File

@ -4,6 +4,7 @@ module com.zhangmeng.onlineexamui {
requires cn.hutool; requires cn.hutool;
requires java.sql; requires java.sql;
requires fastjson; requires fastjson;
requires JavaFx.PaginationPicker;
opens com.zhangmeng.online.exam.ui to javafx.fxml; opens com.zhangmeng.online.exam.ui to javafx.fxml;