高颜值数据库项目实战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. 采用不同尺寸图标格式适应多种运行状态

类结构示例

在这里插入图片描述

最后的优化

注册事件

我们为了提高用户体验,我们添加了拖动事件监听,也就是用鼠标拖动窗口中的任何部分拖动,窗口都会动,非常不错的功能

  • 我们在主类中添加一段代码,我的主类是Management,大家自行添加
  • 我们引用了DragWindowHandler类,我们稍后创建
EventHandler<MouseEvent> handler = new DragWindowHandler(primaryStage);
scene.setOnMousePressed(handler);
scene.setOnMouseDragged(handler);

我们要把这段代码添加到start方法中

@Override
public void start(Stage primaryStage) throws Exception {
    Scene scene = createScene();
    primaryStage.setScene(scene);
    primaryStage.setTitle("Student Information Management System");
    primaryStage.setResizable(false);
    primaryStage.getIcons().add(new Image(Management.class.getResourceAsStream("/source/UniversityTable.png")));

    EventHandler<MouseEvent> handler = new DragWindowHandler(primaryStage);
    scene.setOnMousePressed(handler);
    scene.setOnMouseDragged(handler);
    primaryStage.show();
}

创建DragWindowHandler类

建立DragWindowHandler类

我们建立DragWindowHandler类

  • 我们的类要实现 EventHandler,从而进行控制鼠标拖动
package system;

import javafx.event.EventHandler;
import javafx.scene.input.MouseEvent;
import javafx.stage.Stage;

class DragWindowHandler implements EventHandler<MouseEvent> {
    
}
写构造方法

将将要操作的Stage传进来

package system;

import javafx.event.EventHandler;
import javafx.scene.input.MouseEvent;
import javafx.stage.Stage;

class DragWindowHandler implements EventHandler<MouseEvent> {
    private Stage primaryStage;
    
    DragWindowHandler(Stage primaryStage) {
        this.primaryStage = primaryStage;
    }
}
定义一些位置信息
private double oldStageX;
private double oldStageY;
private double oldScreenX;
private double oldScreenY;
重写handle方法

记录上次的位置,然后实时改变现在的位置

@Override
public void handle(MouseEvent e) {
    if (e.getEventType() == MouseEvent.MOUSE_PRESSED) {
        this.oldStageX = this.primaryStage.getX();
        this.oldStageY = this.primaryStage.getY();
        this.oldScreenX = e.getScreenX();
        this.oldScreenY = e.getScreenY();

    } else if (e.getEventType() == MouseEvent.MOUSE_DRAGGED) {
        this.primaryStage.setX(e.getScreenX() - this.oldScreenX + this.oldStageX);
        this.primaryStage.setY(e.getScreenY() - this.oldScreenY + this.oldStageY);
    }
}
最终DragWindowHandler代码
package system;

import javafx.event.EventHandler;
import javafx.scene.input.MouseEvent;
import javafx.stage.Stage;

class DragWindowHandler implements EventHandler<MouseEvent> {
    private Stage primaryStage;
    private double oldStageX;
    private double oldStageY;
    private double oldScreenX;
    private double oldScreenY;

    DragWindowHandler(Stage primaryStage) {
        this.primaryStage = primaryStage;
    }

    @Override
    public void handle(MouseEvent e) {
        if (e.getEventType() == MouseEvent.MOUSE_PRESSED) {
            this.oldStageX = this.primaryStage.getX();
            this.oldStageY = this.primaryStage.getY();
            this.oldScreenX = e.getScreenX();
            this.oldScreenY = e.getScreenY();

        } else if (e.getEventType() == MouseEvent.MOUSE_DRAGGED) {
            this.primaryStage.setX(e.getScreenX() - this.oldScreenX + this.oldStageX);
            this.primaryStage.setY(e.getScreenY() - this.oldScreenY + this.oldStageY);
        }
    }
}

这样我们就可以实现拖拽了,鼠标不必天机上方的标题进行拖拽,直接拖动Stage就可以了

我们成功了Successfully!!!

最后,非常感谢小伙伴能够一直陪伴走完这美妙的旅途,希望在未来的编程道路上,不做程序员,要做软件设计艺术家!!!

所有文章:

高颜值数据库项目实战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万字!完整精讲解版+源代码)

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值