用javafx制作学生成绩管理系统

一、 效果

1.动画演示

在这里插入图片描述

2.图片演示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

二、实现方向

1.设计界面

       首先考虑了自己的界面要设计成什么样子的才看得舒服,参考了很多页面,看了其他各种软件的界面设计,最终决定模仿一下photoshop初始界面。在这里插入图片描述

2.配置后台

       要实现具体功能可以运行,而不是只有前端好看的界面那就需要配置后台。

三、全部代码

链接:https://pan.baidu.com/s/1UXLT558STDewsEGWoMZmhg
提取码:zzy6

四、代码片段依次讲解

1.首先修改包的名字

如果要在你的电脑可以正常运行的话,这里的包名为practice需要改成你自己的包名,还有不要忘记更改类名哦,更改成你自己的就好啦,此外需要正确好配置javafx环境才能正常运行所有代码。

package practice;//包名

配置好javafx环境的同学直接跳过这部分:

怎么配置javafx呢?

又是付费吗?no!拒绝
这里直接教大家怎么一步步搞定
首先下载这个文件

Javafx配置文件
链接:https://pan.baidu.com/s/1I-Ct88rMlwqLeD-MsLOPsg
提取码:zzy8
下载到哪里都可以,确保自己找得到,桌面也可以
接下来按图片步骤完成:
1、创建一个工程
在这里插入图片描述
2、创建的工程处右键依次打开这些东西在这里插入图片描述
3、找到刚刚下载的文件,依次打开

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
选中这些最后点打开
4.开始创建该工程下的类
注意创建工程后如果没有完成以上操作不要直接创建类,否则后面就算完成了这些操作,导入了javafx包,这个类也相当于没有导入包的。需要重新创建类,所以不妨先完成以上操作,然后再进行类的创建。
5.最后一步就是配置运行
很多同学以为添加了javafx包就不需要再进行配置了,但是发现一运行还是不行,什么问题都没有,为什么运行不了呢,下面给出解决方法,按照这个做就好了。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在此处输入
–module-path C:\sw\javafx-sdk-11.0.2\lib --add-modules javafx.controls,javafx.fxml
注意:加粗部分是需要替换的
替换成什么呢?
首先找到刚刚下的文件
在这里插入图片描述
打开之后,点击lib打开在这里插入图片描述在这里插入图片描述
到了这个页面把光标移到这个位置再按右键
在这里插入图片描述
点击复制地址后把
–module-path C:\sw\javafx-sdk-11.0.2\lib --add-modules javafx.controls,javafx.fxml
里面的粗体替换掉就可以了,把替换后的代码填入下面位置
在这里插入图片描述
然后点击run就可以了,到此处javafx配备完成!


题外话之如何配备深色外观

在这里插入图片描述
在这里插入图片描述还有其他主题外观可供选择

2.片段讲解

(1)包的导入

import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Scanner;
import javax.swing.JTextArea;
import javax.xml.stream.events.StartDocument;
import javafx.animation.FadeTransition;
import javafx.animation.Timeline;
import javafx.application.*;
import javafx.scene.Scene;
import javafx.scene.layout.BackgroundImage;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Ellipse;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Font;
import javafx.scene.text.FontPosture;
import javafx.scene.text.FontWeight;
import javafx.stage.Stage;
import javafx.util.Duration;
import javafx.geometry.*;
import javafx.scene.control.*;

3.start函数外的东西

public class caculate extends Application{
   
	
	private TextField addname=new TextField();
	private TextField addstdid=new TextField();
	private TextField addclass=new TextField();
	private TextField namedelete=new TextField();
	private TextField iddelete=new TextField();
	private TextField ywlrck=new TextField();
	private TextField sxlrck=new TextField();
	private TextField yylrck=new TextField();
	private TextField wllrck=new TextField();
	private TextField hxlrck=new TextField();
	private TextField swlrck=new TextField();
	private TextField xhss=new TextField();
	private TextField namess=new TextField();
	
	TextField xianshiqi=new TextField();
	 Button xinde=new Button("修改");
	
	Button deletebt=new Button("删除");
    public static boolean on=true;
    TextArea biao2=new TextArea();

放到start外是将其作为全局变量便于后面对它们的调用,下面具体解释一下具体是什么,主要有以下几类
(1)TextField

private TextField addname=new TextField();

这个是创建一个文本框,也就是这种东西:
(不过这里用了css改变了一下长宽等 包括后面讲解的各种组件基本都有css渲染了 后面就不啰嗦了 具体怎么渲染后面会说)
在这里插入图片描述
(2)Button

 Button xinde=new Button("修改");

创建了一个按钮也就是这种东西:
在这里插入图片描述
(3) TextArea

TextArea biao2=new TextArea();

创建了一个文本区域,也就是这种可以放文字的区域:在这里插入图片描述
(4)其他

public static boolean on=true;

这一行是为了配置后面算法写的一个boolean型变量

4.start函数内

*片段一

	public void start(Stage ke) throws Exception{
   
		xinde.setPadding(new Insets(10,40,10,40));
		xianshiqi.setPrefSize(200, 25);
		xianshiqi.setEditable(false);
        addname.setPrefSize(350, 40);
        addstdid.setPrefSize(350, 40);
        addclass.setPrefSize(350, 40);
        
        ywlrck.setPrefSize(350, 40);
        sxlrck.setPrefSize(350, 40);
        yylrck.setPrefSize(350, 40);
        wllrck.setPrefSize(350, 40);
        hxlrck.setPrefSize(350, 40);
        swlrck.setPrefSize(350, 40);
        
        xhss.setPrefSize(350, 40);
        namess.setPrefSize(350, 40);
        
        namedelete.setPrefSize(350, 40);
        iddelete.setPrefSize(350, 40);

(1) setPrefSize
使用setPrefSize来设置文本框或者按钮的宽和高
(2)setPadding
使用setPadding来设置节点位置
(也就是节点离面板上面右面下面左面的距离)
xinde.setPadding(new Insets(10,40,10,40));
四个值依次表示(上,右,下,左)

*片段二

BorderPane mianban=new BorderPane();
//		P0

//	        顶部区域
		StackPane top=new StackPane();
		top.setPrefHeight(87);
		top.setStyle("-fx-background-color:rgb(65,65,65);-fx-border-width: 0 0 0 8;-fx-border-style: solid;-fx-border-color: rgb(83,83,83);");
		mianban.setTop(top);
//     左侧区域
	   StackPane left=new StackPane();
	   left.setPrefWidth(370);
	   left.setStyle("-fx-background-color:rgb(35,35,35);-fx-border-width: 0 0 0 8;-fx-border-style: solid;-fx-border-color: rgb(83,83,83);");
	   mianban.setLeft(left);
//	        主场区域
	   StackPane center=new StackPane();
	   center.setPrefWidth(1000);
	   center.setStyle("-fx-background-color:rgb(26,26,26);-fx-border-width: 0 0 0 0;-fx-border-style: solid;-fx-border-color: rgb(83,83,83);");
	   mianban.setCenter(center);
//	   相关按钮
//	   上面按钮
	   Button sousuo=new Button("搜索");

(1)面板布局说明
         设置一个BorderPane放在Scene里面 那么场景就被分成了五个区域 上右下左以及中央,那么如果其中任何一个区域如果不放东西的话,系统就会把这个区域抛弃由其他区域覆盖,因此在这里我只取了左 、上、中央 这三个区域存放东西 ,此外不需要设置BorderPane的宽高,因为整体的宽高会自动填满scene,那么怎么具体设置这三个区域占据宽高的比例呢,区域占据的宽高是由里面的东西撑开的,所以如果不存放东西就不存在,你放的东西有多大被撑开就有多大,那么想要一个初步的大小可以怎么设置呢?只需要在其中放入一个StackPane就可以了,之后想往区域放东西直接放在StackPane里面就可以

StackPane top=new StackPane();

创建栈面板

 center.setPrefWidth(1000);
 top.setPrefHeight(87);

设置栈面板宽高撑开区域

mianban.setCenter(center);
mianban.setLeft(left);
mianban.setTop(top);

三个栈面板分别分配到中间、左、上三个区域里面去

(2) 主面板各区域的css渲染

这里举一个栗子:

 left.setStyle("-fx-background-color:rgb(35,35,35);-fx-border-width: 0 0 0 8;-fx-border-style: solid;-fx-border-color: rgb(83,83,83);");

A、基本格式:
** .setStyle(" ");这种基本格式使用css渲染* 外观
里面加一些属性就可以改变
**外观了

B、属性解释:

-fx-background-color:rgb(35,35,35); 设置背景颜色,具体颜色可以把自己想要做的图用qq截个图放在PS里面直接吸取颜色就可以了,查看rgb值就可以了,也可下载截图吸取颜色的工具
-fx-border-width: 0 0 0 8; 设置边框宽度
-fx-border-style: solid; 把边框设置为可见的实体
-fx-border-color: rgb(83,83,83);"); 给边框加一个颜色

*片段3

	   final ToggleGroup group = new ToggleGroup();
	   ToggleButton cjgl=new ToggleButton("成绩管理");
	   ToggleButton cjlr=new ToggleButton("成绩录入");
	   ToggleButton cjfx=new ToggleButton("成绩分析");
	   ToggleButton xsxx=new ToggleButton("成绩预览");
	   ToggleButton tjxs=new ToggleButton("添加学生");
	   ToggleButton scxs=new ToggleButton("删除学生");
	   cjgl.setToggleGroup(group);
	   cjlr.setToggleGroup(group);
	   cjfx.setToggleGroup(group);
	   xsxx.setToggleGroup(group);
	   tjxs.setToggleGroup(group);
	   scxs.setToggleGroup(group);
	    left.getChildren().addAll(cjgl,cjlr,cjfx,xsxx,tjxs,scxs); 
	  
	 
//       大小
	  cjgl.setPrefSize(210, 70);
	  cjlr.setPrefSize(210, 70);
	  cjfx.setPrefSize(210, 70);
	  xsxx.setPrefSize(210, 70);
	  tjxs.setPrefSize(210, 70);
	  scxs.setPrefSize(210, 70);
	  

	  
	  
	  //	             布局
      left.setMargin(cjgl, new Insets(-650,50,0,50));   	  
      left.setMargin(cjlr, new Insets(-400,50,0,50));  
      left.setMargin(cjfx, new Insets(-150,50,0,50));  
      left.setMargin(xsxx, new Insets(100,50,0,50));  
      left.setMargin(tjxs, new Insets(350,50,0,50));  
      left.setMargin(scxs, new Insets(600,50,0,50));  

(1)代码解释
本段代码是对左侧区域的按钮进行创建和布局
下面具体解释:

 final ToggleGroup group = new ToggleGroup();

用于创建一个按钮组,用于当按其中一个按钮时其他按钮效果会取消

 ToggleButton cjgl=new ToggleButton("成绩管理");

这个是创建一个组内的按钮,并且命名:成绩管理 在界面中渲染后效果如下
在这里插入图片描述

  left.setMargin(cjgl, new Insets(-650,50,0,50));   	

上面是设置外边距的意思
用来设置按钮的位置(按钮在左边区域离各边界的距离来确定位置)
初始状态下按钮是垂直居中的,设置外边距后如果为负值那就向着相反的方向移动,值的意思是上右下左的外边距,此处left是左边的面板cjgl是按钮,也就是设置cjgl在left内的位置
*片段4

//动画效果
//      1
//     1 移入
      cjgl.addEventHandler(MouseEvent.MOUSE_ENTERED, (MouseEvent e) -> {
   
    	  cjgl.setStyle( "-fx-background-radius: 32;-fx-font-weight: bold;-fx-font-size:20;-fx-text-fill:black;-fx-background-color:white;");
    	  cjgl.setPrefSize(210, 70); 
    	});

//      2退出
      cjgl.addEventHandler(MouseEvent.MOUSE_EXITED, (MouseEvent e) -> {
   
        	if(cjgl.isSelected()){
   
    	    cjgl.setPrefSize(230, 80);
    	    cjgl.setStyle( "-fx-background-radius: 32;-fx-font-weight: bold;-fx-font-size:22;-fx-text-fill:black;-fx-background-color:white;");        	
        	}
    	    else{
   
    	    	cjgl.setPrefSize(210, 70);
    	    	cjgl.setStyle( "-fx-background-radius: 32;-fx-font-weight: bold;-fx-font-size:20;-fx-background-color:rgb(35,35,35);-fx-text-fill:white;");
    	    }

      
      });
//按压
      cjgl.setOnMousePressed(e->{
   
    	 
    	  cjlr.setStyle( "-fx-font-weight: bold;-fx-font-size:20;-fx-background-color:rgb(35,35,35);-fx-text-fill:white;");
	      cjfx.setStyle( "-fx-font-weight: bold;-fx-font-size:20;-fx-background-color:rgb(35,35,35);-fx-text-fill:white;");
	      xsxx.setStyle( "-fx-font-weight: bold;-fx-font-size:20;-fx-background-color:rgb(35,35,35);-fx-text-fill:white;");
	      tjxs.setStyle( "-fx-font-weight: bold;-fx-font-size:20;-fx-background-color:rgb(35,35,35);-fx-text-fill:white;");
	      scxs.setStyle( "-fx-font-weight: bold;-fx-font-size:20;-fx-background-color:rgb(35,35,35);-fx-text-fill:white;");
    	cjgl.setPrefSize(230, 80);
    	cjgl.setStyle( "-fx-background-radius: 32;-fx-font-weight: bold;-fx-font-size:22;-fx-text-fill:black;-fx-background-color:white;");        
      });
	  
      cjgl.addEventHandler(MouseEvent.MOUSE_CLICKED, (MouseEvent e) -> {
   
        cjgl.setSelected(true);
  	    cjgl.setPrefSize(230, 80);
  	    cjgl.setStyle( "-fx-background-radius: 32;-fx-font-weight: bold;-fx-font-size:22;-fx-text-fill:black;-fx-background-color:white;");        	

     });

这里只取一个按钮的动画效果进行讲解

(1)移入效果

 cjgl.addEventHandler(MouseEvent.MOUSE_ENTERED, (MouseEvent e) -> {
   }

这个是设置光标移入时候会发生怎么样的事件,{}内的内容为具体事件

 cjgl.setStyle( "-fx-background-radius: 32;-fx-font-weight: bold;-fx-font-size:20;-fx-text-fill:black;-fx-background-color:white;");
    	  cjgl.setPrefSize(210, 70); 

内容如上,解释如下:
-fx-background-radius: 32; 设置按钮的边角半径,决定是方圆的程度
-fx-background-color:white; 设置按钮颜色
cjgl.setPrefSize(210, 70); 设置按钮宽高
-fx-text-fill:black; 设置按钮文字颜色
-fx-font-size:20; 设置按钮里面文字大小
-fx-font-weight: bold; 设置按钮里面文字为加粗效果
设置以上东西,当光标移入的时候就会把按钮从初始的样子变成事件内容的样子,看起来就有了一个动画效果了

同理设置

(2)按压效果

 cjgl.setOnMousePressed(e->{
   }

也就是点击鼠标点下去不松手时候显示为什么样子

(3)点击后效果

 cjgl.addEventHandler(MouseEvent.MOUSE_CLICKED, (MouseEvent e) -> {
   }

也就是点击鼠标松手后但没有把光标移出按钮范围的效果

(4)移出效果

 cjgl.addEventHandler(MouseEvent.MOUSE_EXITED, (MouseEvent e) -> {
   }

也就是光标从按钮里面移出来后变成什么样子

(5)注意点
设置移出效果为什么要用if else语句呢?
因为有两种情况
其一: 将光标移入时没有点击最后移出,但我需要这期间改变外观,出来之后还原初始的外观。
其二: 将光标移入后并点击最后移出,我需要移出之后仍然保存外观

如果只是单纯的设置移出效果,就不能让点击之后仍然保存选中的效果,因为最后都有一个把光标移出来的动作,所以在此处使用一个if else语句 先检测有没有点击选中用:isSelected() 检测,如果有那就继续执行选中后的效果,如果没有那就执行没有选中的效果。

*片段五
此处开始为每一个按钮配备不同的StackPane
然后将其放进BorderPane中的Center区
每个按钮点击时将其他按钮的StackPane清除即可实现中央界面切换效果

//添加学生面板
        HBox add_top=new HBox();
        Label add_toptxt=new Label("添加学生");
        add_toptxt.setStyle("-fx-font-weight: bold;-fx-font-size:22;-fx-text-fill:white;");
        add_top.setStyle("-fx-border-style: solid inside;-fx-border-width: 0 0 2 0;-fx-border-insets:-50;-fx-border-radius: 5;-fx-border-color: blue;");
        add_top.getChildren().add(add_toptxt);
        center.setMargin(add_top, new Insets(280,0,0,745));
        
        Button addbt=new Button("添加");
        addbt.setStyle("-fx-font-weight:bold;");
        GridPane gridPane4=new GridPane();
        gridPane4.setMargin(addbt, new Insets(15,0,0,0));
        addbt.setPadding(new Insets(10,40,10,40));
    	gridPane4.setHgap(15);
    	
    	Label addnametxt=new Label("姓名:");
     	Label addclasstxt=new Label("班级:");
    	Label addstdidtxt=new Label("学号:");
        addnametxt.setStyle("-fx-text-fill:white");
        addclasstxt.setStyle("-fx-text-fill:white");
       
  • 16
    点赞
  • 108
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值