高颜值数据库项目实战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(完整精讲解版+源代码)(八)](当前位置)

高颜值数据库项目实战MySQL+JavaFX+Fxml+CSS(完整精讲解版+源代码)(九)

更多项目逐句吐血精讲在这里,加油ヾ(◍°∇°◍)ノ゙!!

项目效果图

功能点实现

  1. 实现学生信息的录入
  2. 实现学生信息的修改
  3. 实现学生信息的更新
  4. 实现学生信息的删除
  5. 添加快捷键使用,方便快速管理
  6. 使用javafx+fxml+css控制ui样式
  7. 实现以javafx内部api调用绘制字体特效,无需额外资源调度
  8. 实现软件图标自定义,增加软件美观度
  9. 实现拖动窗口即可移动,使更加人性化
  10. 实现软件英文化,增加可交流性
  11. 禁用窗口缩放功能,防止ui碰撞
  12. 添加作者、主页、关闭按钮
  13. 增加事务弹窗,给予正确提示及错误解决方案

内部优化

  1. 使用分装思想,将功能块拆分,设立CreateMenu类,统一添加
  2. 封装错误与信息提示框,统一布局格式
  3. 封装数据库连接类,无需重复调度
  4. 采用Lambda表达式绑定事件,无需重写类
  5. 使用fxml模块化设计标签,方便增改
  6. 采用css设置样式,统一管理
  7. 去除不必要的类public,增加软件安全性
  8. 利用SceneBuilder绘制生成fxml控件,提升编写效率
  9. 采用不同尺寸图标格式适应多种运行状态

类结构示例

在这里插入图片描述

书写其他类的操作逻辑

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 段落

发布了30 篇原创文章 · 获赞 3 · 访问量 5488
App 阅读领勋章
微信扫码 下载APP
阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览