JAVA_FX 资产设备管理
项目所需知识:
1、使用 JavaFX 实现图形用户界面设计
2、使用 MySQL 8.0 数据库系统管理系统数据
3、使用 JDBC API 实现数据库访问
4、使用 IDEA IDE 完成项目开发
项目结构图:
controller包:包含存放和每个FXML文件对应的事件处理类
dao包:存放和每个实体类相对应的实现数据库访问的DAO接口和实现类
model包:包含存放和数据库对应的实体类
util包:存放读属性文件的工具类、数据库操作工具以及用来表示FXML文件路径和窗口标题的枚举类
view包:包含布局界面的FXML文件
需求分析:
1 资产信息管理
管理所有资产设备的基本信息,包括添加、修改、删除等,可以根据各种条件查询出需要的信息。
2 人员信息管理
管理设备的使用人员信息,包括添加、修改、删除等,可以根据各种条件查询出需要的信息。
3 资产设备的领用、归还、报废
管理设备的领用、归还与报废,查询相关信息。
4 系统管理
系统管理模块能中提供了类别管理和退出系统的操作,维护设备分类信息的数据,方便用户对资产的类别进行管理,系统会提示出资产的编号、大类、小类的属性,还会提供对其进行增加、更新、删除、复位和退出的操作。
实现代码:
这里主类用于实现人员信息管理功能模块:
controller包中装有对人员的添加,删除,改变,列表显示的控制类
AddEditPersonInfo.java:
/**
* 添加和编辑资产类别信息窗口的控制器类,
* 把要操作的组件对象声明成该类的属性,
* 属性的名称要和对应的窗口布局文件中组件标记的fx:id属性的值保持一致,
* 并且在属性声明前添加 @FXML注解
*/
public class AddEditPersonInfo extends BaseController implements Initializable {
//FXMl可视图按钮链接到该控制类实现按钮功能
@FXML
public TextField personNameText;
@FXML
public ComboBox<String> personSexText;
@FXML
public TextField personDeptText;
@FXML
public TextField personJobText;
@FXML
public TextField personOtherText;
@FXML
private Button submitButton;
/**
* 提交按钮的事件处理方法,
* 方法的名称要和对应的布局文件中提交按钮的onAction属性的值保持一致,
* 即onAction属性应该这样赋值:onAction="#submit"
*
* @param event Action事件对象
*/
@FXML
private void submit(ActionEvent event) {
// 如果任意字段为空,显示警告对话框
// getText().trim()的作用是:在获得的文本中除去空格. trim()的作用是:去掉字符串左右的空格
if (personNameText.getText().trim().equals("") || personDeptText.getText().trim().equals("") || personJobText.getText().trim().equals("")) {
// 显示对话框
showWarningDialog("要添加或更新的数据是错误的!", "字段的内容不能为空!");
return;
}
PersonInfo personInfo = new PersonInfo(personNameText.getText(), personSexText.getValue(), personDeptText.getText(), personJobText.getText(), personOtherText.getText());
try {
String oldId;
// 如果editPersonInfo不为null,提交的数据是要更新的数据,在更新之前,先删除旧数据
// nonNull是java.util.Objects类中的静态方法,已静态导入,可以直接调用
if (nonNull(editPersonInfo)) {
personInfoData.remove(editPersonInfo);
//并获取要更新数据的id,用该id作为用户输入的要更新数据的id
oldId = editPersonInfo.getPersonID();
personInfo.setPersonID(oldId);
personInfoDao.update(personInfo);
} else {
//把新的资产类别信息添加到数据源,添加成功后返回自动生成的id
oldId = personInfoDao.add(personInfo);
//把新记录的id赋给表格中新添加的对象
personInfo.setPersonID(oldId);
}
//把新的资产类别信息添加到列表
personInfoData.add(personInfo);
clearForm();
//通过ADD_PERSON_INFO枚举对象得到列表窗口的标题和代表布局文件路径的URL对象,
//通过(Node)event.getSource()得到发生事件的组件对象
//切换界面,标题是添加人员信息,执行顺序有没有关系
navigate(ADD_PERSON_INFO.getTitle(), (Node) event.getSource(), ADD_PERSON_INFO.getPage());
//把3个对象传递给navigate方法,从而实现窗口的切换
} catch (Exception e) {
//发生异常后通过警告对话框显示异常信息
showWarningDialog(e.toString());
e.printStackTrace();
}
}
//清空文本框中的内容
private void clearForm() {
personNameText.clear();
personDeptText.clear();
personJobText.clear();
personOtherText.clear();
}
//复位按钮的事件处理,清空文本框中的内容
@FXML
private void reset(ActionEvent event) {
clearForm();
}
//控制器的初始化方法,控制器对象创建后会自动执行此方法
@Override
public void initialize(URL location, ResourceBundle resources) {
personSexText.getSelectionModel().select(0);//默认选第一个
}
}
其次,我们通过FXML文件实现布局界面(展示其中一个界面模块:人员信息列表):
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>
<BorderPane prefHeight="800.0" prefWidth="1500.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.assetsms.controller.ListPersonInfo">
<top>
<fx:include source="Menu.fxml" />
</top>
<center>
<BorderPane prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER">
<top>
<HBox alignment="CENTER" prefHeight="100.0" prefWidth="200.0" BorderPane.alignment="CENTER">
<children>
<Label text="请输入搜索内容:">
<font>
<Font size="16.0" />
</font></Label>
<TextField fx:id="searchInfoText" prefHeight="23.0" prefWidth="219.0">
<font>
<Font size="16.0" />
</font></TextField>
</children>
</HBox>
</top>
<center>
<TableView fx:id="personListTable" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER">
<columns>
<TableColumn fx:id="personIDColumn" prefWidth="363.0" style="-fx-alignment: center" text="人员编号" />
<TableColumn fx:id="nameTextColumn" prefWidth="198.0" style="-fx-alignment: center" text="姓名" />
<TableColumn fx:id="sexTextColumn" prefWidth="162.0" style="-fx-alignment: center" text="性别" />
<TableColumn fx:id="deptTextColumn" prefWidth="206.0" style="-fx-alignment: center" text="部门" />
<TableColumn fx:id="jobTextColumn" minWidth="0.0" prefWidth="241.0" style="-fx-alignment: center" text="职位" />
<TableColumn fx:id="otherColumn" prefWidth="154.0" style="-fx-alignment: center" text="其他" />
</columns>
</TableView>
</center>
<bottom>
<HBox alignment="CENTER" prefHeight="100.0" prefWidth="200.0" style="-fx-spacing: 20;" BorderPane.alignment="CENTER">
<children>
<Button fx:id="deleteButton" mnemonicParsing="false" onAction="#doDelete" text="删除">
<font>
<Font size="16.0" />
</font></Button>
<!--声明一个更新Button元素,fx:id用于给该Button一个标示,用于和Controller类中的Button实例进行绑定-->
<!--onAction用于绑定Button的点击事件,#doUpdate前面的#用于和Controller中处理函数进行绑定-->
<Button fx:id="updateButton" mnemonicParsing="false" onAction="#doUpdate" text="更新" textAlignment="CENTER">
<!--<font>用于修改Button默认的字体及其大小-->
<font>
<Font size="16.0" />
</font></Button>
</children>
</HBox>
</bottom>
</BorderPane>
</center>
</BorderPane>
最后,需要在dao包里面建立人员信息与数据库的连接,添加PersonInfoDao.java文件
public class PersonInfoDaoMySQLImpl implements PersonInfoDao {
private DBUtil dbUtil;
public PersonInfoDaoMySQLImpl() {
//新建一个数据库
dbUtil=new DBUtil();
}
@Override
public List<Person> findAll() throws Exception {
dbUtil.getConnection();
//查询Person表中的所有字段,可以通过最后连接进行select * from语句的学习
ResultSet rs=dbUtil.executeQuery("select * from Person");
List<Person> list=new ArrayList<>();
Person Person=null;
while (rs.next()){
Person=new Person(
rs.getString("personID"),
rs.getString("Name"),
rs.getString("Sex"),
rs.getString("Dept"),
rs.getString("Job"),
rs.getString("other"));
list.add(Person);
}
dbUtil.closeAll();
return list;
}
@Override
public Person findById(String PersonID) throws Exception {
dbUtil.getConnection();
ResultSet rs=dbUtil.executeQuery("select * from Person where PersonID=?",PersonID);
Person person=null;
if(rs.next()){
person=new Person(
rs.getString("PersonID"),
rs.getString("Name"),
rs.getString("Sex"),
rs.getString("Dept"),
rs.getString("Job"),
rs.getString("Other"));
}
dbUtil.closeAll();
return person;
}
@Override
public void delete(String PersonID) throws Exception {
dbUtil.getConnection();
dbUtil.executeUpdate("delete from Person where PersonID=?",PersonID);
dbUtil.closeAll();
}
@Override
public void update(Person person) throws Exception {
dbUtil.getConnection();
dbUtil.executeUpdate(
"update Person set Name=?,Sex=?,Dept=?,Job=?,Other=? where PersonID=?",
person.getNameText(),
person.getSexText(),
person.getDeptText(),
person.getJobText(),
person.getOther());
dbUtil.closeAll();
}
@Override
public String add(Person person) throws Exception {
String id=null;
dbUtil.getConnection();
dbUtil.executeUpdate("insert into Person(PersonID,Name,Sex,Dept,Job,Other) values(uuid(),?,?,?,?,?)",person.getNameText(),person.getSexText(),person.getDeptText(),person.getJobText(),person.getOther());
ResultSet rs=dbUtil.executeQuery("select PersonID from Person where Name=? and Sex=? and Dept=? and Job=? and Other=?",person.getNameText(),person.getSexText(),person.getDeptText(),person.getJobText(),person.getOther());
if (rs.next()){
id=rs.getString(1);
}
dbUtil.closeAll();
return id;
}
}
JAVAFX中文学习文档
JAVA官方学习平台
mysql数据库SQL查询语句SELECT详细查询
学习使用JDBC连接数据库