8:高颜值JavaFX数据库-九讲之八
高颜值数据库项目实战MySQL+JavaFX+Fxml+CSS(完整精讲解版+源代码)(一)
高颜值数据库项目实战MySQL+JavaFX+Fxml+CSS(完整精讲解版+源代码)(二)
高颜值数据库项目实战MySQL+JavaFX+Fxml+CSS(完整精讲解版+源代码)(三)
高颜值数据库项目实战MySQL+JavaFX+Fxml+CSS(完整精讲解版+源代码)(四)
高颜值数据库项目实战MySQL+JavaFX+Fxml+CSS(完整精讲解版+源代码)(五)
高颜值数据库项目实战MySQL+JavaFX+Fxml+CSS(完整精讲解版+源代码)(六)
高颜值数据库项目实战MySQL+JavaFX+Fxml+CSS(完整精讲解版+源代码)(七)
[高颜值数据库项目实战MySQL+JavaFX+Fxml+CSS(完整精讲解版+源代码)(八)](当前位置)
高颜值数据库项目实战MySQL+JavaFX+Fxml+CSS(完整精讲解版+源代码)(九)
项目效果图
|
|
| |
|
功能点实现
- 实现学生信息的录入
- 实现学生信息的修改
- 实现学生信息的更新
- 实现学生信息的删除
- 添加快捷键使用,方便快速管理
- 使用javafx+fxml+css控制ui样式
- 实现以javafx内部api调用绘制字体特效,无需额外资源调度
- 实现软件图标自定义,增加软件美观度
- 实现拖动窗口即可移动,使更加人性化
- 实现软件英文化,增加可交流性
- 禁用窗口缩放功能,防止ui碰撞
- 添加作者、主页、关闭按钮
- 增加事务弹窗,给予正确提示及错误解决方案
内部优化
- 使用分装思想,将功能块拆分,设立CreateMenu类,统一添加
- 封装错误与信息提示框,统一布局格式
- 封装数据库连接类,无需重复调度
- 采用Lambda表达式绑定事件,无需重写类
- 使用fxml模块化设计标签,方便增改
- 采用css设置样式,统一管理
- 去除不必要的类public,增加软件安全性
- 利用SceneBuilder绘制生成fxml控件,提升编写效率
- 采用不同尺寸图标格式适应多种运行状态
类结构示例
书写其他类的操作逻辑
1、书写Search类的操作
上次,在Search中我们写了如下代码:
package system;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.control.TextField;
import java.io.IOException;
public class Search {
@FXML
TextField Number;
@FXML
TextField Name;
@FXML
TextField Gender;
@FXML
TextField Address;
@FXML
TextField Phone;
@FXML
TextField Major;
@FXML
void SearchButtonAction(ActionEvent event) {
}
Parent createNode() throws IOException {
return FXMLLoader.load(getClass().getResource("../source/SearchFxml.fxml"));
}
}
添加搜索事件按钮
这次,我们添加搜索事件按钮
- 内部逻辑与上一个十分相似
- getText()获取Number文本框中的数据
- 我们做一次判断,如果没有填搜索内容,那么就不能进行搜索
- 我们上一次创建了一个专门显示错误信息的类,那么,我们可以直接弹出一个框,告诉用户错误
void SearchButtonAction(ActionEvent event) throws SQLException {
if(Number.getText().length() == 0){
new MassageError().show("Search Error!","Student Number Is Not Null,Please Input Student Number.");
}
else {
SearchSQL(Number.getText());
}
}
创建数据库执行语句
下面,我们创建SearchSQL函数用来传导数据库
- 依旧是建立statement 、写sql 、执行操作executeQuery,详见上一章
- 这次,我们返回的是一个集合,我们使用resultSet.next()依次访问,把从数据库中获取到的内容显示到文本框中
- 当if不成立时,我们可以直接弹出一个框,告诉用户错误
- 最后,我们把流关闭,详见上一章
private void SearchSQL(String text) throws SQLException {
Statement statement = new ConnectSQL().connectSQL();
assert statement != null;
final String sql = "select * from student where id = '" + Number.getText() + "';";
ResultSet resultSet = statement.executeQuery(sql);
if(resultSet.next()){
Name.setText(resultSet.getString("name"));
Gender.setText(resultSet.getString("gender"));
Address.setText(resultSet.getString("address"));
Phone.setText(resultSet.getString("phone"));
Major.setText(resultSet.getString("major"));
statement.getConnection().close();
}else {
new MassageError().show("Search Error!",Number.getText() + " is Not Exist!");
statement.getConnection().close();
}
}
Search类效果图
我们输入学号,点击Search将会看到搜索结果
我们看到了结果
Search类完整代码
package system;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.control.TextField;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Search {
@FXML
TextField Number;
@FXML
TextField Name;
@FXML
TextField Gender;
@FXML
TextField Address;
@FXML
TextField Phone;
@FXML
TextField Major;
@FXML
void SearchButtonAction(ActionEvent event) throws SQLException {
if(Number.getText().length() == 0){
new MassageError().show("Search Error!","Student Number Is Not Null,Please Input Student Number.");
}
else {
SearchSQL(Number.getText());
}
}
private void SearchSQL(String text) throws SQLException {
Statement statement = new ConnectSQL().connectSQL();
assert statement != null;
final String sql = "select * from student where id = '" + Number.getText() + "';";
ResultSet resultSet = statement.executeQuery(sql);
if(resultSet.next()){
Name.setText(resultSet.getString("name"));
Gender.setText(resultSet.getString("gender"));
Address.setText(resultSet.getString("address"));
Phone.setText(resultSet.getString("phone"));
Major.setText(resultSet.getString("major"));
statement.getConnection().close();
}else {
new MassageError().show("Search Error!",Number.getText() + " is Not Exist!");
statement.getConnection().close();
}
}
Parent createNode() throws IOException {
return FXMLLoader.load(getClass().getResource("../source/SearchFxml.fxml"));
}
}
2、书写Delete 类的操作
上次,在Delete 中我们写了如下代码:
package system;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.control.Alert;
import javafx.scene.control.ButtonBar;
import javafx.scene.control.ButtonType;
import javafx.scene.control.TextField;
import java.io.IOException;
public class Delete {
@FXML
TextField Number;
@FXML
TextField Name;
@FXML
TextField Gender;
@FXML
TextField Address;
@FXML
TextField Phone;
@FXML
TextField Major;
@FXML
void SearchButtonAction(ActionEvent event) {
}
@FXML
void DeleteButtonAction(ActionEvent event) {
}
Parent createNode() throws IOException {
return FXMLLoader.load(getClass().getResource("../source/DeleteFxml.fxml"));
}
}
添加搜索事件按钮
我们在此之前要新建一个studentExist来判断这个学生是否存在
private boolean studentExist = false;
这里,我们可以完全的抄前面搜索的代码,因为删除之前,我们至少要先找出来
@FXML
void SearchButtonAction(ActionEvent event) throws SQLException {
if(Number.getText().length() == 0){
new MassageError().show("Search Error!","Student Number Is Not Null,Please Input Student Number.");
}
else {
studentExist = SearchSQL(Number.getText());
}
}
private boolean SearchSQL(String text) throws SQLException {
Statement statement = new ConnectSQL().connectSQL();
assert statement != null;
final String sql = "select * from student where id = '" + Number.getText() + "';";
ResultSet resultSet = statement.executeQuery(sql);
if(resultSet.next()){
Name.setText(resultSet.getString("name"));
Gender.setText(resultSet.getString("gender"));
Address.setText(resultSet.getString("address"));
Phone.setText(resultSet.getString("phone"));
Major.setText(resultSet.getString("major"));
statement.getConnection().close();
return true;
}else {
new MassageError().show("Search Error!",Number.getText() + " is Not Exist!");
statement.getConnection().close();
return false;
}
}
添加删除事件按钮
我们首先判断学生是否存在,如果不存在直接抛出错误
@FXML
void DeleteButtonAction(ActionEvent event) throws SQLException {
if(!studentExist){
new MassageError().show("Delete Error!","Student is Not Exist!");
return;
}
}
询问一下用户是否真的需要删除
紧接着,我们询问一下用户是否真的需要删除,我们在
Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
alert.setTitle("worning");
alert.setContentText("Do You Want Delete this Student?");
Optional<ButtonType> buttonTypeOptional = alert.showAndWait();
判断一下,如果用户选择了什么
接下来,我们判断一下,如果用户选择了是,那么就执行操作
if(buttonTypeOptional.get().getButtonData().equals(ButtonBar.ButtonData.OK_DONE))
执行SQL语句
下面又是我们的老步骤
- 依旧是建立statement 、写sql 、执行操作executeQuery,详见上一章
- 当if成立时,我们弹出窗口告知用户,并清空窗口
- 当if不成立时,我们可以直接弹出一个框,告诉用户错误
- 最后,我们把流关闭,详见上一章
if(buttonTypeOptional.get().getButtonData().equals(ButtonBar.ButtonData.OK_DONE)){
Statement statement = new ConnectSQL().connectSQL();
assert statement != null;
final String sql = "delete from student where id = '" + Number.getText() + "';";
if(statement.executeUpdate(sql) > 0){
new MassageInformation().show("Delete Successfully", sql);
clearText();
}else{
new MassageError().show("Delete Error!","Delete Error,Maybe The Table Is Restricted");
}
}
最后添加清空操作方法
private void clearText(){
Number.clear();
Name.clear();
Gender.clear();
Address.clear();
Phone.clear();
Major.clear();
}
Delete 类效果图
我们还是输入学号进行搜索
我们点击Search进行搜索
我们点击确定确认删除
提示我们已经删除成功
我们到数据库中看,数据已经消失
Delete 类完整代码
package system;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.control.Alert;
import javafx.scene.control.ButtonBar;
import javafx.scene.control.ButtonType;
import javafx.scene.control.TextField;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Optional;
public class Delete {
@FXML
TextField Number;
@FXML
TextField Name;
@FXML
TextField Gender;
@FXML
TextField Address;
@FXML
TextField Phone;
@FXML
TextField Major;
private boolean studentExist = false;
@FXML
void SearchButtonAction(ActionEvent event) throws SQLException {
if(Number.getText().length() == 0){
new MassageError().show("Search Error!","Student Number Is Not Null,Please Input Student Number.");
}
else {
studentExist = SearchSQL(Number.getText());
}
}
private boolean SearchSQL(String text) throws SQLException {
Statement statement = new ConnectSQL().connectSQL();
assert statement != null;
final String sql = "select * from student where id = '" + Number.getText() + "';";
ResultSet resultSet = statement.executeQuery(sql);
if(resultSet.next()){
Name.setText(resultSet.getString("name"));
Gender.setText(resultSet.getString("gender"));
Address.setText(resultSet.getString("address"));
Phone.setText(resultSet.getString("phone"));
Major.setText(resultSet.getString("major"));
statement.getConnection().close();
return true;
}else {
new MassageError().show("Search Error!",Number.getText() + " is Not Exist!");
statement.getConnection().close();
return false;
}
}
@FXML
void DeleteButtonAction(ActionEvent event) throws SQLException {
if(!studentExist){
new MassageError().show("Delete Error!","Student is Not Exist!");
return;
}
Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
alert.setTitle("worning");
alert.setContentText("Do You Want Delete this Student?");
Optional<ButtonType> buttonTypeOptional = alert.showAndWait();
if(buttonTypeOptional.get().getButtonData().equals(ButtonBar.ButtonData.OK_DONE)){
Statement statement = new ConnectSQL().connectSQL();
assert statement != null;
final String sql = "delete from student where id = '" + Number.getText() + "';";
if(statement.executeUpdate(sql) > 0){
new MassageInformation().show("Delete Successfully", sql);
clearText();
}else{
new MassageError().show("Delete Error!","Delete Error,Maybe The Table Is Restricted");
}
}
}
private void clearText(){
Number.clear();
Name.clear();
Gender.clear();
Address.clear();
Phone.clear();
Major.clear();
}
Parent createNode() throws IOException {
return FXMLLoader.load(getClass().getResource("../source/DeleteFxml.fxml"));
}
}
3、书写Update类的操作
上次,在Update中我们写了如下代码:
package system;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.control.TextField;
import java.io.IOException;
public class Update {
@FXML
TextField Number;
@FXML
TextField Name;
@FXML
TextField Gender;
@FXML
TextField Address;
@FXML
TextField Phone;
@FXML
TextField Major;
@FXML
void SearchButtonAction(ActionEvent event) {
}
@FXML
void UpdateButtonAction(ActionEvent event) {
}
Parent createNode() throws IOException {
return FXMLLoader.load(getClass().getResource("../source/UpdateFxml.fxml"));
}
}
添加搜索事件按钮
这里,我们可以完全的抄前面搜索的代码,因为更新之前,我们至少要先找出来
@FXML
void SearchButtonAction(ActionEvent event) throws SQLException {
if (Number.getText().length() == 0) {
new MassageError().show("Search Error!", "Student Number Is Not Null,Please Input Student Number.");
} else {
SearchSQL(Number.getText());
}
}
private void SearchSQL(String text) throws SQLException {
Statement statement = new ConnectSQL().connectSQL();
assert statement != null;
final String sql = "select * from student where id = '" + Number.getText() + "';";
ResultSet resultSet = statement.executeQuery(sql);
if (resultSet.next()) {
Name.setText(resultSet.getString("name"));
Gender.setText(resultSet.getString("gender"));
Address.setText(resultSet.getString("address"));
Phone.setText(resultSet.getString("phone"));
Major.setText(resultSet.getString("major"));
statement.getConnection().close();
} else {
new MassageError().show("Search Error!", Number.getText() + " is Not Exist!");
statement.getConnection().close();
}
}
添加更新事件按钮
执行SQL语句
下面又是我们的老步骤
- 依旧是建立statement 、写sql 、执行操作executeQuery,详见上一章
- 当if成立时,我们弹出窗口告知用户,并清空窗口
- 当if不成立时,我们可以直接弹出一个框,告诉用户错误
- 最后,我们把流关闭,详见上一章
@FXML
void UpdateButtonAction(ActionEvent event) throws SQLException {
Statement statement = new ConnectSQL().connectSQL();
assert statement != null;
final String sql = "update student set name = '" + Name.getText() + "', gender = '" + Gender.getText() + "', address = '" + Address.getText() + "', phone = '" + Phone.getText() + "', major = '" + Major.getText() + "' where id = '" + Number.getText() + "';";
System.out.println(sql);
if (statement.executeUpdate(sql) > 0) {
new MassageInformation().show("update Successfully!", sql);
} else {
new MassageError().show("update Error!", "Insert Error,Maybe The Table Is Restricted");
}
statement.getConnection().close();
clearText();
}
最后添加清空操作方法
private void clearText(){
Number.clear();
Name.clear();
Gender.clear();
Address.clear();
Phone.clear();
Major.clear();
}
Update 类效果图
我们输入学号,点击Search将会看到搜索结果
我们看到了结果
我们修改里面的值
点击Update即可升级
在数据库中,我们就可以看到效果了
Update 类完整代码
package system;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.control.TextField;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Update {
@FXML
TextField Number;
@FXML
TextField Name;
@FXML
TextField Gender;
@FXML
TextField Address;
@FXML
TextField Phone;
@FXML
TextField Major;
@FXML
void SearchButtonAction(ActionEvent event) throws SQLException {
if (Number.getText().length() == 0) {
new MassageError().show("Search Error!", "Student Number Is Not Null,Please Input Student Number.");
} else {
SearchSQL(Number.getText());
}
}
private void SearchSQL(String text) throws SQLException {
Statement statement = new ConnectSQL().connectSQL();
assert statement != null;
final String sql = "select * from student where id = '" + Number.getText() + "';";
ResultSet resultSet = statement.executeQuery(sql);
if (resultSet.next()) {
Name.setText(resultSet.getString("name"));
Gender.setText(resultSet.getString("gender"));
Address.setText(resultSet.getString("address"));
Phone.setText(resultSet.getString("phone"));
Major.setText(resultSet.getString("major"));
statement.getConnection().close();
} else {
new MassageError().show("Search Error!", Number.getText() + " is Not Exist!");
statement.getConnection().close();
}
}
@FXML
void UpdateButtonAction(ActionEvent event) throws SQLException {
Statement statement = new ConnectSQL().connectSQL();
assert statement != null;
final String sql = "update student set name = '" + Name.getText() + "', gender = '" + Gender.getText() + "', address = '" + Address.getText() + "', phone = '" + Phone.getText() + "', major = '" + Major.getText() + "' where id = '" + Number.getText() + "';";
System.out.println(sql);
if (statement.executeUpdate(sql) > 0) {
new MassageInformation().show("update Successfully!", sql);
} else {
new MassageError().show("update Error!", "Insert Error,Maybe The Table Is Restricted");
}
statement.getConnection().close();
clearText();
}
private void clearText() {
Number.clear();
Name.clear();
Gender.clear();
Address.clear();
Phone.clear();
Major.clear();
}
Parent createNode() throws IOException {
return FXMLLoader.load(getClass().getResource("../source/UpdateFxml.fxml"));
}
}
关注后续章节,我们会添加更多功能:
高颜值数据库项目实战MySQL+JavaFX+Fxml+CSS(完整精讲解版+源代码)(一)
高颜值数据库项目实战MySQL+JavaFX+Fxml+CSS(完整精讲解版+源代码)(二)
高颜值数据库项目实战MySQL+JavaFX+Fxml+CSS(完整精讲解版+源代码)(三)
高颜值数据库项目实战MySQL+JavaFX+Fxml+CSS(完整精讲解版+源代码)(四)
高颜值数据库项目实战MySQL+JavaFX+Fxml+CSS(完整精讲解版+源代码)(五)
高颜值数据库项目实战MySQL+JavaFX+Fxml+CSS(完整精讲解版+源代码)(六)
高颜值数据库项目实战MySQL+JavaFX+Fxml+CSS(完整精讲解版+源代码)(七)
[高颜值数据库项目实战MySQL+JavaFX+Fxml+CSS(完整精讲解版+源代码)(八)](当前位置)
高颜值数据库项目实战MySQL+JavaFX+Fxml+CSS(完整精讲解版+源代码)(九)
后记
更多项目逐句吐血精讲在这里,加油ヾ(◍°∇°◍)ノ゙!!
C语言飞机大战小游戏(2万字!完整精讲解版+源代码)
Markdown 6334 字数 243 行数 当前行 216, 当前列 17 文章已保存12:24:37 HTML 4288 字数 158 段落