添加form 表单 ,组件联动 2025年3月15日11:29:10

master
qmstyle 2025-03-15 11:29:20 +08:00
parent 6546b9c285
commit e81095af0d
14 changed files with 381 additions and 10 deletions

View File

@ -7,6 +7,7 @@ import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.zhangmeng.online.exam.ui.api.form.UserForm;
import com.zhangmeng.online.exam.ui.api.model.PermissionDataLoad;
import com.zhangmeng.online.exam.ui.api.model.QuestionDataLoad;
import com.zhangmeng.online.exam.ui.api.model.RoleDataLoad;
@ -62,6 +63,7 @@ public class ApiUtils {
public static DataView getUserList() {
DataLoad dataLoad = new UserDataLoad();
dataLoad.setForm(new UserForm());
return dataLoad.loadData(PAGE_NUM,PAGE_SIZE);
}

View File

@ -1,6 +1,7 @@
package com.zhangmeng.online.exam.ui.api;
import javafx.beans.property.SimpleStringProperty;
import javafx.scene.Parent;
import java.util.List;
import java.util.Map;
@ -13,4 +14,11 @@ import java.util.Map;
public interface DataLoad {
public ApiUtils.DataView loadData(Integer pageNum, Integer pageSize);
public void setForm(Parent view);
public Parent getForm();
Map<String, Object> saveForm(Map<String, Object> map);
}

View File

@ -0,0 +1,118 @@
package com.zhangmeng.online.exam.ui.api.form;
import com.zhangmeng.online.exam.ui.api.ApiUtils;
import com.zhangmeng.online.exam.ui.api.DataLoad;
import com.zhangmeng.online.exam.ui.api.model.UserDataLoad;
import com.zhangmeng.online.exam.ui.components.DynamicTableComponent;
import com.zhangmeng.online.exam.ui.components.callBack.DynamicTableComponentCallBack;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.ObservableList;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;
import javafx.stage.Window;
import java.util.HashMap;
import java.util.Map;
/**
* @author zm
* @date 2025/3/14 17:40
* @version: 1.0
*/
public class UserForm extends AnchorPane {
private DynamicTableComponent tableComponent;
public DynamicTableComponent getTableComponent() {
return tableComponent;
}
public void setTableComponent(DynamicTableComponent tableComponent) {
this.tableComponent = tableComponent;
}
public UserForm() {
Label username_label = new Label("用户名:");
username_label.setLayoutX(83.0);
username_label.setLayoutY(64.0);
TextField username_field = new TextField();
username_field.setLayoutX(162.0);
username_field.setLayoutY(60.0);
username_field.setPrefHeight(23.0);
username_field.setPrefWidth(289.0);
username_field.setPromptText("请输入用户名");
PasswordField password_field = new PasswordField();
password_field.setLayoutX(162.0);
password_field.setLayoutY(117.0);
password_field.setPrefHeight(23.0);
password_field.setPrefWidth(289.0);
password_field.setPromptText("请输入密码");
Label password_label = new Label("密码:");
password_label.setLayoutX(87.0);
password_label.setLayoutY(121.0);
Label phone_label = new Label("手机号:");
phone_label.setLayoutX(87.0);
phone_label.setLayoutY(169.0);
TextField phone_field = new TextField();
phone_field.setLayoutX(162.0);
phone_field.setLayoutY(165.0);
phone_field.setPrefHeight(23.0);
phone_field.setPrefWidth(289.0);
phone_field.setPromptText("请输入手机号");
Label email_label = new Label("邮箱:");
email_label.setLayoutX(87.0);
email_label.setLayoutY(224.0);
TextField email_field = new TextField();
email_field.setLayoutX(162.0);
email_field.setLayoutY(220.0);
email_field.setPrefHeight(23.0);
email_field.setPrefWidth(289.0);
email_field.setPromptText("请输入邮箱");
Button submit_button = new Button("提交");
submit_button.setLayoutX(263.0);
submit_button.setLayoutY(288.0);
submit_button.setOnAction(e -> {
DataLoad formDataLoad = new UserDataLoad();
Map<String, Object> map = new HashMap<>();
map.put("username", username_field.getText());
map.put("password", password_field.getText());
map.put("phone", phone_field.getText());
map.put("email", email_field.getText());
formDataLoad.saveForm(map);
Stage stage = (Stage) this.getScene().getWindow();
stage.close();
DynamicTableComponentCallBack callBack = tableComponent.getCallBack();
ObservableList<Map<String, SimpleStringProperty>> data = tableComponent.getData();
data.clear();
data.addAll(callBack.flushData(1, ApiUtils.PAGE_SIZE).getDataList());
});
this.getChildren().addAll(username_label,
username_field,
password_field,
phone_label,
phone_field,
email_label,
email_field,
submit_button,
password_label);
}
}

View File

@ -7,6 +7,7 @@ import com.zhangmeng.online.exam.ui.api.ApiUtils;
import com.zhangmeng.online.exam.ui.api.DataLoad;
import com.zhangmeng.online.exam.ui.utils.HttpUtils;
import javafx.beans.property.SimpleStringProperty;
import javafx.scene.Parent;
import java.util.*;
@ -40,4 +41,19 @@ public class PermissionDataLoad implements DataLoad {
}
return new ApiUtils.DataView(Arrays.asList("序号", "权限名称", "描述", "权限路径"), permissionMapList).setDataLoad(this).setPageNum(pageNum).setPageSize(pageSize).setTotal(total);
}
@Override
public void setForm(Parent view) {
}
@Override
public Parent getForm() {
return null;
}
@Override
public Map<String, Object> saveForm(Map<String, Object> map) {
return null;
}
}

View File

@ -7,6 +7,7 @@ import com.zhangmeng.online.exam.ui.api.ApiUtils;
import com.zhangmeng.online.exam.ui.api.DataLoad;
import com.zhangmeng.online.exam.ui.utils.HttpUtils;
import javafx.beans.property.SimpleStringProperty;
import javafx.scene.Parent;
import java.util.*;
@ -40,4 +41,20 @@ public class QuestionDataLoad implements DataLoad {
}
return new ApiUtils.DataView(Arrays.asList("序号", "权限名称", "描述", "权限路径"), questionMapList).setDataLoad(this).setPageNum(pageNum).setPageSize(pageSize).setTotal(total);
}
@Override
public void setForm(Parent view) {
}
@Override
public Parent getForm() {
return null;
}
@Override
public Map<String, Object> saveForm(Map<String, Object> map) {
return null;
}
}

View File

@ -7,6 +7,7 @@ import com.zhangmeng.online.exam.ui.api.ApiUtils;
import com.zhangmeng.online.exam.ui.api.DataLoad;
import com.zhangmeng.online.exam.ui.utils.HttpUtils;
import javafx.beans.property.SimpleStringProperty;
import javafx.scene.Parent;
import java.util.*;
@ -40,4 +41,19 @@ public class RoleDataLoad implements DataLoad {
}
return new ApiUtils.DataView(Arrays.asList("序号", "角色名称", "描述", "角色类型"), roleMapList).setDataLoad(this).setPageNum(pageNum).setPageSize(pageSize).setTotal(total);
}
@Override
public void setForm(Parent view) {
}
@Override
public Parent getForm() {
return null;
}
@Override
public Map<String, Object> saveForm(Map<String, Object> map) {
return null;
}
}

View File

@ -4,12 +4,14 @@ 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.AlertUtils;
import com.zhangmeng.online.exam.ui.utils.HttpUtils;
import javafx.beans.property.SimpleStringProperty;
import java.util.*;
import com.zhangmeng.online.exam.ui.api.ApiUtils;
import javafx.scene.Parent;
/**
* @author zm
@ -17,12 +19,15 @@ import com.zhangmeng.online.exam.ui.api.ApiUtils;
* @version: 1.0
*/
public class UserDataLoad implements DataLoad {
private Parent form;
@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);
String userListData = HttpUtils.GET(ApiUtils.API_URL + "/user/list", params);
JSONObject jsonObject = JSON.parseObject(userListData);
JSONArray data = jsonObject.getJSONArray("data");
int total = jsonObject.getIntValue("total");
@ -41,4 +46,26 @@ public class UserDataLoad implements DataLoad {
dataView.setDataLoad(this);
return dataView;
}
@Override
public void setForm(Parent view) {
this.form = view;
}
@Override
public Parent getForm() {
return this.form;
}
@Override
public Map<String, Object> saveForm(Map<String, Object> map) {
String result = HttpUtils.POST(ApiUtils.API_URL + "/user/save", map);
JSONObject jsonObject = JSON.parseObject(result);
if (jsonObject.getIntValue("code") == 200){
AlertUtils.alert_msg("保存成功!");
}else {
AlertUtils.alert_warning("保存失败!");
}
return null;
}
}

View File

@ -9,6 +9,7 @@ import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.Button;
import javafx.scene.control.Pagination;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
@ -16,6 +17,8 @@ import javafx.scene.control.cell.MapValueFactory;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.stage.Window;
import org.casic.javafx.control.PaginationPicker;
import java.util.*;
@ -44,7 +47,11 @@ public class DynamicTableComponent extends VBox {
private final ObservableList<Map<String, SimpleStringProperty>> data = FXCollections.observableArrayList();
// public DynamicTableComponent(List<Map<String, SimpleStringProperty>> dataList,List<String> keys) {
public ObservableList<Map<String, SimpleStringProperty>> getData() {
return data;
}
// public DynamicTableComponent(List<Map<String, SimpleStringProperty>> dataList,List<String> keys) {
public DynamicTableComponent(ApiUtils.DataView dataView) {
super();
List<Map<String, SimpleStringProperty>> dataList = dataView.getDataList();
@ -77,6 +84,15 @@ public class DynamicTableComponent extends VBox {
tableView.getColumns().add(column);
});
data.addAll(dataList);
///添加按钮
Button button = new Button("新增");
button.setOnAction(event -> {
Stage window = (Stage) this.getScene().getWindow();
callBack.Add(callBack.getAddForm(), window,this);
});
this.getChildren().add(button);
this.setSpacing(10);
this.getChildren().addAll(tableView);
//初始化一个分页
@ -95,7 +111,6 @@ public class DynamicTableComponent extends VBox {
data.addAll(callBack.flushData(paginationPicker.getCurrentPage(),paginationPicker.getPageSize()).getDataList());
}
});
this.getChildren().add(paginationPicker);
}

View File

@ -2,7 +2,11 @@ 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 com.zhangmeng.online.exam.ui.components.DynamicTableComponent;
import javafx.beans.property.SimpleStringProperty;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.stage.Stage;
import java.util.List;
import java.util.Map;
@ -16,4 +20,8 @@ public interface DynamicTableComponentCallBack {
public ApiUtils.DataView flushData(Integer pageNum, Integer pageSize);
//新增数据
public void Add(Parent node, Stage primaryStage, DynamicTableComponent dynamicTableComponent);
public Parent getAddForm();
}

View File

@ -2,7 +2,14 @@ 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 com.zhangmeng.online.exam.ui.api.form.UserForm;
import com.zhangmeng.online.exam.ui.components.DynamicTableComponent;
import com.zhangmeng.online.exam.ui.utils.AlertUtils;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.ObservableList;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.stage.Stage;
import java.util.List;
import java.util.Map;
@ -16,6 +23,13 @@ public class DynamicTableComponentCallBackImpl implements DynamicTableComponentC
private DataLoad dataLoad;
private Parent node;
public DynamicTableComponentCallBackImpl(DataLoad dataLoad,Parent node) {
this.dataLoad = dataLoad;
this.node = node;
}
public DynamicTableComponentCallBackImpl(DataLoad dataLoad) {
this.dataLoad = dataLoad;
}
@ -25,6 +39,18 @@ public class DynamicTableComponentCallBackImpl implements DynamicTableComponentC
return dataLoad.loadData(pageNum, pageSize);
}
@Override
public void Add(Parent node, Stage primaryStage, DynamicTableComponent table) {
UserForm userForm = (UserForm)node;
userForm.setTableComponent(table);
AlertUtils.alert("设置", node, primaryStage);
}
@Override
public Parent getAddForm() {
return this.node;
}
public DataLoad getDataLoad() {
return dataLoad;
}
@ -32,4 +58,12 @@ public class DynamicTableComponentCallBackImpl implements DynamicTableComponentC
public void setDataLoad(DataLoad dataLoad) {
this.dataLoad = dataLoad;
}
public Node getNode() {
return node;
}
public void setNode(Parent node) {
this.node = node;
}
}

View File

@ -138,7 +138,7 @@ public class SideMenu extends VBox {
tp.expandedProperty().addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
System.out.println("tp.expandedProperty().addListener====>" + newValue);
//System.out.println("tp.expandedProperty().addListener====>" + newValue);
}
});
@ -151,10 +151,10 @@ public class SideMenu extends VBox {
@Override
public void changed(ObservableValue<? extends TitledPane> observable, TitledPane oldValue, TitledPane newValue) {
if (newValue == null) {
System.out.println(oldValue.getText() + "=====>折叠");
//System.out.println(oldValue.getText() + "=====>折叠");
return;
}
System.out.println(newValue.getText() + "=====>展开");
//System.out.println(newValue.getText() + "=====>展开");
}
});
@ -168,7 +168,7 @@ public class SideMenu extends VBox {
dataView.setPageSize(dataView.getPageSize());
dataView.setTotal(dataView.getTotal());
DynamicTableComponent dynamicTableComponent = new DynamicTableComponent(dataView);
dynamicTableComponent.setCallBack(new DynamicTableComponentCallBackImpl(dataView.getDataLoad()));
dynamicTableComponent.setCallBack(new DynamicTableComponentCallBackImpl(dataView.getDataLoad(),dataView.getDataLoad().getForm()));
dynamicTableComponent.setPadding(new Insets(15));
dynamicTableComponent.prefHeightProperty().bind(root.heightProperty().subtract(15));
root.setCenter(dynamicTableComponent);

View File

@ -0,0 +1,89 @@
/*
* MIT License
*
* Copyright (c) 2023
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
*/
package com.zhangmeng.online.exam.ui.utils;
import javafx.fxml.FXMLLoader;
import javafx.scene.Group;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import javafx.stage.Window;
import java.io.IOException;
/**
* @author :
* @version : 1.0
* @date : 2023-02-17 09:59
*/
public class AlertUtils {
/**
*
*/
public static void alert_warning(String msg) {
Alert alert = new Alert(Alert.AlertType.WARNING);
alert.initModality(Modality.APPLICATION_MODAL);
alert.setContentText(msg);
alert.setHeaderText(null);
alert.show();
}
public static void alert_msg(String msg) {
Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.initModality(Modality.APPLICATION_MODAL);
alert.setContentText(msg);
alert.setHeaderText(null);
alert.show();
}
public static void alert(String title, Parent node, Stage primaryStage) {
alert(title, node, 600, 400, primaryStage);
}
public static void alert(String title, Parent node, int width, int height, Stage primaryStage) {
Scene scene = new Scene(new Group(node));
Stage stage = new Stage();
stage.setScene(scene);
stage.setTitle(title);
stage.setWidth(width);
stage.setHeight(height);
stage.initStyle(StageStyle.UTILITY);
stage.initOwner(primaryStage);
stage.initModality(Modality.APPLICATION_MODAL);
stage.setResizable(false);
stage.show();
stage.setOnCloseRequest(e -> {
stage.close();
});
}
}

View File

@ -32,9 +32,8 @@ public class HttpUtils<T> {
return HttpUtil.get(url, params);
}
public static <T> T POST(String url, Map<String, Object> params, Class<T> clazz) {
String response = HttpUtil.post(url, params);
return JSONObject.parseObject(response, clazz);
public static String POST(String url, Map<String, Object> params) {
return HttpUtil.post(url, params);
}
public static <T> T POSTFileUPLOAD(String url, Map<String, Object> params, File file, Class<T> clazz) {

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.PasswordField?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/19" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fmxl.UserForm">
<children>
<Label layoutX="83.0" layoutY="64.0" text="用户名:" />
<PasswordField layoutX="162.0" layoutY="117.0" prefHeight="23.0" prefWidth="289.0" />
<Label layoutX="87.0" layoutY="121.0" text="密码:" />
<Label layoutX="87.0" layoutY="169.0" text="手机号:" />
<Label layoutX="87.0" layoutY="224.0" text="邮箱:" />
<TextField layoutX="162.0" layoutY="60.0" prefHeight="23.0" prefWidth="289.0" />
<TextField layoutX="162.0" layoutY="165.0" prefHeight="23.0" prefWidth="289.0" />
<TextField layoutX="162.0" layoutY="220.0" prefHeight="23.0" prefWidth="289.0" />
<Button layoutX="263.0" layoutY="288.0" mnemonicParsing="false" text="提交" />
</children>
</AnchorPane>