内容要求:
综合性实验 学生成绩分析程序
实验类型:综合性
实验目的:综合运用Java语言和面向对象技术开发一个小型软件系统
实验内容:
1. 现在已知某个班的某门课程的期末考试成绩已经存储在一个文本文件中。
(1)文件名说明:
文件名形式为:“班级名称-课程名称.txt”,即主文件名由 “班级名称”和“课程名称”组成,中间用“-”连接;扩展名为TXT。例如:
2014级软件工程8班-面向对象程序设计.txt
表示该文件中存放“2014级软件工程8班”的“面向对象程序设计”的期末考试成绩。
(2)文件内容格式:
文本文件中每行存储一个学生的成绩,包括:学号、姓名和成绩,中间用英文逗号分隔。
说明:学号和姓名是字符串,成绩是实数。
例如:“2014级软件工程8班-面向对象程序设计.txt”文件中存放该班学生面向对象程序设计的考试成绩。内容为:
201230740801,赵一,68
201230740802,钱二,82
201230740803,孙三,58
201230740804,李四,62
201230740805,冯五,73
……
2. 实验要求完成的功能:
(1)从文本文件读取某一个班某门课程的考试成绩。
根据输入的“班级名称”和“课程名称”查找指定班级的文本文件是否存在。
如果不存在,提示错误信息。
如果存在,把文件中所有的数据读取到内存中。并提示文件读取成功。
(2)将内存中的成绩数据另存为一个基于对象的二进制文件。
程序应当定义合适的类表示每个学生的成绩和全部学生的成绩。并序列化存储到二进行制的对象文件中。主文件名使用文本文件的主文件名,扩展名使用“.score”。
(3)读取二进制对象文件
把程序另存为的二进制对象文件读取到内存。
(4)显示全部成绩单
要求:按成绩从高到低输出,成绩相等时,按学生从低到高输出。
显示方式如下:
班级名称:2014级软件工程8班
课程名称:面向对象程序设计
学号 姓名 成绩
----------------------------------
201230740801 赵一 68
201230740802 钱二 82
201230740803 孙三 58
201230740804 李四 62
201230740805 冯五 73
……
----------------------------------
最高分:82
最低分:58
平均分:77.50
(5)查询学生的考试成绩
要求:可以根据学号或姓名进行模糊查询。输入使用统一输入。
例如,
输入:3074,则输出所有学号或姓名中包含“3074”的学生的信息。
输入:李,则输出所有学号或姓名中包含“李”的学生的信息。
(6)界面实现
基本要求是“命令行界面”,例如:
1.读取文件文件
2.另存为二进制对象文件
3.读取二进制对象文件
4.显示全部成绩
5.查询学生成绩
0.退出
-----------------------------------
效果图如下:
柱形分析图
饼形图
参考资料:
1.文件选择窗口 :javafx.stage.FileChooser
http://docs.oracle.com/javafx/2/ui_controls/file-chooser.htm
2.创建文件菜单 : javafx.scene.control.Menu
http://blog.csdn.net/maosijunzi/article/details/43760713
3.javafx创建多样表格 : javafx.scene.control.TableView
http://ju.outofmemory.cn/entry/17067
http://www.jb51.net/article/44238.htm
4.柱形图 javafx.scene.chart.BarChart
http://docs.oracle.com/javafx/2/charts/bar-chart.htm
5.饼形图javafx.scene.chart.PieChart
http://docs.oracle.com/javafx/2/charts/pie-chart.htm
netbeans开发的源代码包:
链接:https://pan.baidu.com/s/1cOe-PwKVVLZPoWnpzBMXsA 密码:kzut
代码如下:
- package studentsgradesanalyzer;
- /**
- *
- * @author acerr
- */
- import javafx.application.Application;
- import javafx.scene.Scene;
- import javafx.stage.Stage;
- import javafx.scene.layout.*;
- public class StudentsGradesAnalyzer extends Application{
- /**
- * @param args the command line arguments
- */
- @Override
- public void start(Stage primaryStage) {
- BorderPane primaryBorderPane=new BorderPane();//最外面板
- BorderPane borderPane=new BorderPane();//文件面板,
- FileMenu fileMenu=new FileMenu();//定义文件菜单实例
- borderPane.setTop(fileMenu.addMenu());//添加文件菜单模块
- borderPane.setCenter(fileMenu.getCheckNode());//添加输入查询模块
- primaryBorderPane.setTop(borderPane);
- primaryBorderPane.setCenter(fileMenu.getGradesTable());//添加成绩单模块
- primaryBorderPane.setRight(fileMenu.getDataAnalyzer());
- primaryBorderPane.setBottom(fileMenu.getTextPath());
- primaryStage.setScene(new Scene(primaryBorderPane,666,450));
- primaryStage.setTitle("StudentsGradesAnalyzer");
- primaryStage.show();
- }
- public static void main(String[] args) {
- // TODO code application logic here
- launch(args);
- }
- }
- package studentsgradesanalyzer;
- /**
- * 文件菜单
- *
- * @author acerr
- */
- import java.io.BufferedReader;
- import java.io.EOFException;
- import javafx.scene.control.Menu;
- import javafx.scene.control.MenuBar;
- import javafx.scene.control.MenuItem;
- import javafx.stage.FileChooser;
- import javafx.stage.FileChooser.ExtensionFilter;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.io.ObjectInputStream;
- import java.io.ObjectOutputStream;
- import java.io.PrintWriter;
- import java.io.UnsupportedEncodingException;
- import java.util.logging.Level;
- import java.util.logging.Logger;
- import javafx.scene.control.TextField;
- import javafx.scene.layout.HBox;
- import javafx.scene.paint.Color;
- import javafx.scene.text.Font;
- import javafx.scene.text.Text;
- public class FileMenu {
- private final MenuItem miOpenGrades = new MenuItem("打开文本文件成绩单"), miSaveGrades = new MenuItem("另存为文本文件成绩单"),
- miOpenObjectGrades = new MenuItem("打开对象文本文件成绩单"), miSaveObjectGrades = new MenuItem("另存为对象文本文件成绩单"),
- miClean = new MenuItem("清除数据");
- private final Menu menu = new Menu("文件");
- private final GradesTable gradesTable = new GradesTable();//定义成绩单实例
- private final DataAnalyzer dataAnalyzer = new DataAnalyzer();//定义数据分析实例
- private final TextField tfCheck = new TextField();//输入查询文本框
- private final Text textPath = new Text();
- private final String path = new String();//文件路径
- FileMenu() {
- }
- public final MenuBar addMenu() {
- //文件菜单
- MenuBar mb = new MenuBar();
- mb.getMenus().add(menu);
- menu.getItems().addAll(miOpenGrades, miSaveGrades, miOpenObjectGrades, miSaveObjectGrades, miClean);
- //打开文本文件成绩单
- miOpenGrades.setOnAction(e -> {
- openGrades();
- });
- //保存文本文件成绩单
- miSaveGrades.setOnAction(e -> {
- saveGrades();
- });
- //打开对象文本文件
- miOpenObjectGrades.setOnAction(e -> {
- openObjectGrades();
- });
- //保存对象文本文件
- miSaveObjectGrades.setOnAction(e -> {
- try {
- saveObjectGrades();
- } catch (IOException ex) {
- Logger.getLogger(FileMenu.class.getName()).log(Level.SEVERE, null, ex);
- }
- });
- //清除数据
- miClean.setOnAction(e -> {
- gradesTable.cleanData();
- dataAnalyzer.setTfData("", "", "", "", "", "", "", "", "", "", "", "", "");
- textPath.setText("");
- tfCheck.setText("");
- });
- return mb;
- }
- //由于需要在这个类读取文件,所以在此定义成绩单的实例,并返回
- public GradesTable getGradesTable() {
- return gradesTable;
- }
- //返回DataAnayzer的实例
- public DataAnalyzer getDataAnalyzer() {
- return dataAnalyzer;
- }
- //返回输入查询节点
- public HBox getCheckNode() {
- HBox hBox = new HBox();
- Text text = new Text(" 输入学号或姓名或成绩,然后打回车可查询,点击表格列头可排序 ");
- text.setFill(Color.RED);
- text.setFont(Font.font(15));
- hBox.getChildren().addAll(tfCheck, text);
- tfCheck.setPromptText("输入字段,打回车键查询");
- tfCheck.setOnAction(e -> {
- gradesTable.updateFilterGrades(tfCheck.getText());
- analyzeData();
- });
- return hBox;
- }
- //返回文件路径
- public Text getTextPath() {
- textPath.setVisible(true);
- return textPath;
- }
- //分析数据
- public void analyzeData() {
- if (gradesTable.getObservableList().isEmpty()) {//若数据为空
- dataAnalyzer.setTfData("", "", "", "", "", "", "", "", "", "", "", "", "");
- return;
- }
- //计算
- gradesTable.calculate();
- //显示分析数据
- dataAnalyzer.setTfData(gradesTable.getHightestGrade(), gradesTable.getLowestGrade(), gradesTable.getAverageGrade(),
- gradesTable.getOutStandingNumber(), gradesTable.getOutstandingPercent(), gradesTable.getGoodNumber(),
- gradesTable.getGoodPercent(), gradesTable.getMediumNumber(), gradesTable.getMediumPercent(),
- gradesTable.getPassNumber(), gradesTable.getPassPercent(), gradesTable.getNotPassNumber(),
- gradesTable.getNotPassPercent());
- }
- //打开文本文件
- public void openGrades() {
- FileChooser fileChooser = new FileChooser();//选择文件控件
- // fileChooser.setInitialDirectory(//初始路径
- // new File(System.getProperty("user.home"))
- // );
- fileChooser.getExtensionFilters().addAll(//添加过滤器
- new ExtensionFilter("文本文件成绩单(*.txt)", "*.txt"),
- new ExtensionFilter("所有文件", "*.*")
- );
- File file = fileChooser.showOpenDialog(null);
- if (file != null && file.getName().endsWith(".txt")) {
- try {
- gradesTable.cleanData();
- InputStreamReader read = new InputStreamReader(new FileInputStream(file), "utf-8");//考虑utf-8编码
- BufferedReader bufferedReader = new BufferedReader(read);
- String str = new String();
- while ((str = bufferedReader.readLine()) != null) {
- if (str.trim().length() > 0) {//排除空行
- gradesTable.addGrades(str);
- }
- }
- read.close();
- } catch (FileNotFoundException ex) {
- System.out.println("File is not exit");
- ex.printStackTrace();
- } catch (IOException ex) {
- Logger.getLogger(FileMenu.class.getName()).log(Level.SEVERE, null, ex);
- }
- //分析数据
- analyzeData();
- textPath.setText(file.getPath() + "\\" + gradesTable.getPeopleSum() + "人");
- } else {
- System.out.println("打开文件错误");
- }
- }
- //保存文本文件
- public void saveGrades() {
- FileChooser fileChooser = new FileChooser();
- fileChooser.getExtensionFilters().addAll(//添加过滤器
- new ExtensionFilter("文本文件成绩单(*.txt)", "*.txt"),
- new ExtensionFilter("所有文件", "*.*")
- );
- fileChooser.setInitialFileName("Grades.txt");//设置默认文件名
- File file = fileChooser.showSaveDialog(null);
- if (file != null) {
- try (PrintWriter output = new PrintWriter(file,"utf-8")) {//用utf-8写
- for (TableData data : gradesTable.getObservableList()) {
- String str = data.getNumber() + "," + data.getName() + "," + data.getGrade();
- output.println(str);
- }
- // output.close();//output要关闭,否则数据写入不成功,可改用try(PrintWriter output=new PrintWriter()){ ....}
- System.out.println("保存成功");
- } catch (FileNotFoundException ex) {
- System.out.println("保存文件文本成绩单错误");
- ex.printStackTrace();
- } catch (UnsupportedEncodingException ex) {
- Logger.getLogger(FileMenu.class.getName()).log(Level.SEVERE, null, ex);
- }
- }
- }
- //打开对象文本文件
- public void openObjectGrades() {
- FileChooser fileChooser = new FileChooser();//选择文件控件
- fileChooser.getExtensionFilters().addAll(//添加过滤器
- new ExtensionFilter("对象文本文件成绩单(*.dat)", "*.dat"),
- new ExtensionFilter("所有文件", "*.*")
- );
- File file = fileChooser.showOpenDialog(null);
- if (file != null && file.getName().endsWith(".dat")) {
- try (ObjectInputStream input = new ObjectInputStream(new FileInputStream(file));) {//读取对象文件
- gradesTable.cleanData();
- while (true) {
- String str = (String) input.readObject();//对象只能一次读一个,在保存对象文件时,可改保存一个字符串数组,再次读取时会读取一个字符串数组对象
- System.out.println(str);
- gradesTable.addGrades(str);
- }
- } catch (EOFException e) {
- //已从流中读完。,对while(true)抛出错误
- }catch (FileNotFoundException ex) {
- System.out.println("File is not exit");
- ex.printStackTrace();
- } catch (UnsupportedEncodingException ex) {
- Logger.getLogger(FileMenu.class.getName()).log(Level.SEVERE, null, ex);
- } catch (IOException ex) {
- Logger.getLogger(FileMenu.class.getName()).log(Level.SEVERE, null, ex);
- } catch (ClassNotFoundException ex) {
- Logger.getLogger(FileMenu.class.getName()).log(Level.SEVERE, null, ex);
- }
- //分析数据
- analyzeData();
- textPath.setText(file.getPath() + "\\" + gradesTable.getPeopleSum() + "人");//文件路径
- } else {
- System.out.println("打开对象文件错误");
- }
- }
- //保存对象文本文件
- public void saveObjectGrades() throws IOException {
- FileChooser fileChooser = new FileChooser();
- fileChooser.getExtensionFilters().addAll(//添加过滤器
- new ExtensionFilter("文本文件成绩单(*.dat)", "*.dat"),
- new ExtensionFilter("所有文件", "*.*")
- );
- fileChooser.setInitialFileName("Grades.dat");//设置默认文件名
- File file = fileChooser.showSaveDialog(null);
- if (file != null) {
- try (ObjectOutputStream output = new ObjectOutputStream(new FileOutputStream(file));) {
- for (TableData data : gradesTable.getObservableList()) {
- String str = data.getNumber() + "," + data.getName() + "," + data.getGrade();
- output.writeObject(str);
- }
- System.out.println("保存成功");
- } catch (FileNotFoundException ex) {
- System.out.println("保存对象文件文本成绩单错误");
- ex.printStackTrace();
- }
- }
- }
- }
- package studentsgradesanalyzer;
- import javafx.beans.property.SimpleStringProperty;
- /**
- * 数据模型
- * @author acerr
- */
- public class TableData {
- SimpleStringProperty number, name, grade;
- public TableData(String number, String name, String grade) {
- this.number = new SimpleStringProperty(number);
- this.name = new SimpleStringProperty(name);
- this.grade = new SimpleStringProperty(grade);
- }
- public String getNumber() {
- return number.get();
- }
- public void setNumber(String number) {
- this.number.set(number);
- }
- public String getName() {
- return name.get();
- }
- public void setName(String name) {
- this.name.set(name);
- }
- public String getGrade() {
- return grade.get();
- }
- public void setGrade(String grade) {
- this.grade.set(grade);
- }
- }
- package studentsgradesanalyzer;
- /**
- * 成绩单表格
- * @author acerr
- */
- import javafx.scene.control.TableView;
- import javafx.scene.control.TableColumn;
- import javafx.collections.FXCollections;
- import javafx.collections.ObservableList;
- import javafx.beans.property.SimpleStringProperty;
- import javafx.scene.control.cell.PropertyValueFactory;
- public class GradesTable extends TableView {
- // private TableView<tabledata> tableView=new TableView<>();
- private TableColumn tcNumber = new TableColumn("学号"), tcName = new TableColumn("姓名"), tcGrade = new TableColumn("成绩");
- private final ObservableList<tabledata> olOriginalGrades = FXCollections.observableArrayList(),//为实现查询,保存原始数据
- olFilterGrades = FXCollections.observableArrayList();//过滤后的数据,注:由于需要用到动态的ObservableList,不要用static修饰
- private double hightestGrade = 0, lowesGrade = 0, averageGrade = 0, outStandingNumber = 0, outstandingPercent = 0, goodNumber = 0, goodPercent = 0,
- mediumNumber = 0, mediumPercent = 0, passNumber = 0, passPercent = 0, notPassNumber = 0, notPassPercent = 0, outstandingSum = 0, goodSum = 0,
- mediumSum = 0, passSum = 0, notPassSum = 0,peopleSum=0;
- public GradesTable() {
- this(",".split("[,]"));
- }
- public GradesTable(String[] strGrades) {
- getColumns().addAll(tcNumber, tcName, tcGrade);
- tcNumber.setCellValueFactory(new PropertyValueFactory<tabledata string="">("number"));
- tcName.setCellValueFactory(new PropertyValueFactory<tabledata string="">("name"));
- tcGrade.setCellValueFactory(new PropertyValueFactory<tabledata string="">("grade"));
- tcNumber.setMinWidth(110);
- tcName.setMinWidth(110);
- tcGrade.setMinWidth(110);
- addGrades(strGrades);
- setItems(olFilterGrades);//向表格添加数据
- }
- //添加数据
- public void addGrades(String[] strGrades) {
- for (String str : strGrades) {
- addGrades(str);
- }
- }
- public void addGrades(String strGrade) {
- if(strGrade.trim().length()<1 return="" string="" strtabledata="strGrade.trim().split('[,]');" olfiltergrades="" add="" new="" tabledata="" strtabledata="" 0="" strtabledata="" 1="" strtabledata="" 2="" oloriginalgrades="" add="" new="" tabledata="" strtabledata="" 0="" strtabledata="" 1="" strtabledata="" 2="" public="" void="" cleandata="" olfiltergrades="" clear="" oloriginalgrades="" clear="" public="" void="" setzero="" outstandingnumber="0;" goodnumber="0;" mediumnumber="0;" passnumber="0;" notpassnumber="0;" outstandingsum="0;" goodsum="0;" mediumsum="0;" passsum="0;" notpasssum="0;" peoplesum="0;" public="" void="" calculate="" setzero="" hightestgrade="0;" lowesgrade="100;" for="" tabledata="" data="" :="" olfiltergrades="" double="" grade="Double.valueOf(data.getGrade());" if="" grade="">= 90) {
- outStandingNumber++;
- outstandingSum += grade;
- } else if (grade >= 80) {
- goodNumber++;
- goodSum += grade;
- } else if (grade >= 70) {
- mediumNumber++;
- mediumSum += grade;
- } else if (grade >= 60) {
- passNumber++;
- passSum += grade;
- } else {
- notPassNumber++;
- notPassSum += grade;
- }
- if (grade > hightestGrade) {
- hightestGrade = grade;
- }
- if (grade < lowesGrade) {
- lowesGrade = grade;
- }
- }
- peopleSum = outStandingNumber + goodNumber + mediumNumber + passNumber + notPassNumber;
- averageGrade = (outstandingSum + goodSum + mediumSum + passSum + notPassSum) / peopleSum;
- outstandingPercent = outStandingNumber * 100.0 / peopleSum;
- goodPercent = goodNumber * 100.0 / peopleSum;
- mediumPercent = mediumNumber * 100.0 / peopleSum;
- passPercent = passNumber * 100.0 / peopleSum;
- notPassPercent = notPassNumber * 100.0 / peopleSum;
- }
- //过滤(查询)数据
- public void updateFilterGrades(String reserveString) {
- olFilterGrades.clear();
- if (reserveString.trim().length() < 1) {//如果保留字段为空
- olFilterGrades.addAll(olOriginalGrades);
- System.out.println("字段为空");
- } else {
- for (TableData data : olOriginalGrades) {
- if (data.getNumber().contains(reserveString.trim()) || data.getName().contains(reserveString.trim())
- || data.getGrade().contains(reserveString.trim())) {
- olFilterGrades.add(data);
- }
- }
- }
- }
- //返回过滤后的数据
- public ObservableList<tabledata> getObservableList() {
- return olFilterGrades;
- }
- public String getHightestGrade() {
- return String.format("%.2f", hightestGrade);
- }
- public String getLowestGrade() {
- return String.format("%.2f", lowesGrade);
- }
- public String getAverageGrade() {
- return String.format("%.2f", averageGrade);
- }
- public String getOutStandingNumber() {
- return String.format("%.0f", outStandingNumber);
- }
- public String getOutstandingPercent() {
- return String.format("%.2f", outstandingPercent);
- }
- public String getGoodNumber() {
- return String.format("%.0f", goodNumber);
- }
- public String getGoodPercent() {
- return String.format("%.2f", goodPercent);
- }
- public String getMediumNumber() {
- return String.format("%.0f", mediumNumber);
- }
- public String getMediumPercent() {
- return String.format("%.2f", mediumPercent);
- }
- public String getPassNumber() {
- return String.format("%2.0f", passNumber);
- }
- public String getPassPercent() {
- return String.format("%2.2f", passPercent);
- }
- public String getNotPassNumber() {
- return String.format("%2.0f", notPassNumber);
- }
- public String getNotPassPercent() {
- return String.format("%2.2f", notPassPercent);
- }
- //总人数
- public int getPeopleSum(){
- return olOriginalGrades.size();
- }
- }
- package studentsgradesanalyzer;
- /**
- * 数据分析
- * @author acerr
- */
- import javafx.geometry.Insets;
- import javafx.geometry.Pos;
- import javafx.scene.layout.GridPane;
- import javafx.scene.layout.VBox;
- import javafx.scene.layout.HBox;
- import javafx.scene.control.Button;
- import javafx.scene.control.Label;
- import javafx.scene.control.TextField;
- import javafx.stage.Stage;
- import javafx.scene.Scene;
- import javafx.scene.chart.*;
- //import javafx.scene.chart.BarChart;
- //import javafx.scene.chart.CategoryAxis;
- //import javafx.scene.chart.NumberAxis;
- public class DataAnalyzer extends VBox {
- private TextField tfHighestGrade = new TextField(), tfLowestGrade = new TextField(), tfAverageGrade = new TextField(), tfOutStandingNumber = new TextField(),
- tfOutstandingPercent = new TextField(), tfGoodNumber = new TextField(), tfGoodPercent = new TextField(), tfMediumNumber = new TextField(),
- tfMediumPercent = new TextField(), tfPassNumber = new TextField(), tfPassPercent = new TextField(), tfNotPassNumber = new TextField(),
- tfNotPassPercent = new TextField();
- private Button btBarChart = new Button("显示柱形分析图"), btPieChart = new Button("显示饼形分析图");
- private GridPane gridPane = new GridPane();
- public DataAnalyzer() {
- //设置不可输入
- tfHighestGrade.setEditable(false);
- tfLowestGrade.setEditable(false);
- tfAverageGrade.setEditable(false);
- tfOutStandingNumber.setEditable(false);
- tfOutstandingPercent.setEditable(false);
- tfGoodNumber.setEditable(false);
- tfGoodPercent.setEditable(false);
- tfMediumNumber.setEditable(false);
- tfMediumPercent.setEditable(false);
- tfPassNumber.setEditable(false);
- tfPassPercent.setEditable(false);
- tfNotPassNumber.setEditable(false);
- tfNotPassPercent.setEditable(false);
- //设置宽度
- tfHighestGrade.setMaxWidth(110);
- tfLowestGrade.setMaxWidth(110);
- tfAverageGrade.setMaxWidth(110);
- tfOutStandingNumber.setMaxWidth(110);
- tfOutstandingPercent.setMaxWidth(60);
- tfGoodNumber.setMaxWidth(110);
- tfGoodPercent.setMaxWidth(60);
- tfMediumNumber.setMaxWidth(110);
- tfMediumPercent.setMaxWidth(60);
- tfPassNumber.setMaxWidth(110);
- tfPassPercent.setMaxWidth(60);
- tfNotPassNumber.setMaxWidth(110);
- tfNotPassPercent.setMaxWidth(60);
- //添加行
- gridPane.addRow(0, new Label("最高分"), tfHighestGrade);
- gridPane.addRow(1, new Label("最低分"), tfLowestGrade);
- gridPane.addRow(2, new Label("平均分"), tfAverageGrade);
- gridPane.addRow(3, new Label("优秀(90-100)"), tfOutStandingNumber, new Label("人,占"), tfOutstandingPercent, new Label("%"));
- gridPane.addRow(4, new Label("良好(80-89)"), tfGoodNumber, new Label("人,占"), tfGoodPercent, new Label("%"));
- gridPane.addRow(5, new Label("中等(70-79)"), tfMediumNumber, new Label("人,占"), tfMediumPercent, new Label("%"));
- gridPane.addRow(6, new Label("及格(60-69)"), tfPassNumber, new Label("人,占"), tfPassPercent, new Label("%"));
- gridPane.addRow(7, new Label("不及格(0-60)"), tfNotPassNumber, new Label("人,占"), tfNotPassPercent, new Label("%"));
- gridPane.setVgap(10);
- gridPane.setHgap(5);
- HBox hBox = new HBox();
- hBox.getChildren().addAll(btBarChart, btPieChart);
- hBox.setAlignment(Pos.CENTER);
- hBox.setSpacing(10);//设间距
- setMargin(gridPane, new Insets(10));//设置外边距
- getChildren().addAll(gridPane, hBox);
- setSpacing(10);//设间距
- //显示饼形图,旋转效果
- Stage pieStage = new Stage();
- NewPieChart pieChart = new NewPieChart();
- pieStage.setScene(new Scene(pieChart));
- btPieChart.setOnAction(e -> {
- if (tfOutStandingNumber.getText().trim().length()>0) {
- pieChart.setPieData(tfOutStandingNumber.getText(), tfGoodNumber.getText(), tfMediumNumber.getText(),
- tfPassNumber.getText(), tfNotPassNumber.getText());
- if (pieChart.getScene() != null) {
- pieChart.getScene().setRoot(new VBox());//若已显示,新设根
- }
- pieStage.setScene(new Scene(pieChart));
- pieStage.show();
- }
- });
- //显示柱形图
- Stage barStage = new Stage();
- final CategoryAxis xAxis = new CategoryAxis();
- final NumberAxis yAxis = new NumberAxis();
- xAxis.setLabel("成绩");
- yAxis.setLabel("人数/(人)");
- NewBarChart barChart = new NewBarChart(xAxis, yAxis);
- barStage.setScene(new Scene(barChart));
- btBarChart.setOnAction(e -> {
- // barChart.setData("5", "5", "5", "5", "5");
- if (tfOutStandingNumber.getText().trim().length()>0) {//若分析数据不为空
- if (barChart.getScene() != null) {
- barChart.getScene().setRoot(new VBox());
- }
- barChart.setData(tfOutStandingNumber.getText(), tfGoodNumber.getText(), tfMediumNumber.getText(), tfPassNumber.getText(), tfNotPassNumber.getText());
- barStage.setScene(new Scene(barChart));
- barStage.show();
- }
- });
- }
- //显示分析数据
- public void setTfData(String hightestGrade, String lowesGrade, String averageGrade, String outStandingNumber, String outstandingPercent,
- String goodNumber, String goodPercent, String mediumNumber, String mediumPercent, String passNumber, String passPercent,
- String notPassNumber, String notPassPercent) {
- tfHighestGrade.setText(hightestGrade);
- tfLowestGrade.setText(lowesGrade);
- tfAverageGrade.setText(averageGrade);
- tfOutStandingNumber.setText(outStandingNumber);
- tfOutstandingPercent.setText(outstandingPercent);
- tfGoodNumber.setText(goodNumber);
- tfGoodPercent.setText(goodPercent);
- tfMediumNumber.setText(mediumNumber);
- tfMediumPercent.setText(mediumPercent);
- tfPassNumber.setText(passNumber);
- tfPassPercent.setText(passPercent);
- tfNotPassNumber.setText(notPassNumber);
- tfNotPassPercent.setText(notPassPercent);
- }
- }
- package studentsgradesanalyzer;
- /**
- * 柱形图
- * @author acerr
- */
- import javafx.scene.chart.*;
- import javafx.collections.FXCollections;
- import javafx.collections.ObservableList;
- public class NewBarChart extends BarChart{
- private XYChart.Series seriesOutstanding = new XYChart.Series(),seriesGood=new XYChart.Series(),seriesMedium=new XYChart.Series(),
- seriesPass=new XYChart.Series(),seriesNotPass=new XYChart.Series();//五个变量
- final static String outstanding=new String("优秀(90-100)"),good=new String("良好(80-89)"),medium=new String("中等(70-79)"),
- pass=new String("及格(60-69)"),notPass=new String("不及格(0-60)");
- public NewBarChart(Axis xAxis, Axis yAxis) {
- super(xAxis,yAxis);
- seriesOutstanding.setName(outstanding);
- seriesGood.setName(good);
- seriesMedium.setName(medium);
- seriesPass.setName(pass);
- seriesNotPass.setName(notPass);
- setData("0","0","0","0","0");
- getData().addAll(seriesOutstanding,seriesGood,seriesMedium,seriesPass,seriesNotPass);
- }
- public void setData(String data1,String data2,String data3,String data4,String data5){
- seriesOutstanding.getData().setAll(new XYChart.Data(outstanding,Double.valueOf(data1)));
- seriesGood.getData().setAll(new XYChart.Data(good,Double.valueOf(data2)));
- seriesMedium.getData().setAll(new XYChart.Data(medium,Double.valueOf(data3)));
- seriesPass.getData().setAll(new XYChart.Data(pass,Double.valueOf(data4)));
- seriesNotPass.getData().setAll(new XYChart.Data<>(notPass,Double.valueOf(data5)));
- }
- }
- package studentsgradesanalyzer;
- /**
- * 饼形图
- * @author acerr
- */
- import javafx.scene.chart.*;
- import javafx.collections.FXCollections;
- import javafx.collections.ObservableList;
- public class NewPieChart extends PieChart{
- public NewPieChart() {
- super(FXCollections.observableArrayList(
- new PieChart.Data("优秀(90-100)", 5),
- new PieChart.Data("良好(80-89)", 5),
- new PieChart.Data("中等(70-79)", 5),
- new PieChart.Data("及格(60-69)", 5),
- new PieChart.Data("不及格(0-60)", 5)));
- }
- // String data1,String data2,String data3,String data4,String data5
- public void setPieData(String data1,String data2,String data3,String data4,String data5){
- super.setData(FXCollections.observableArrayList(
- new PieChart.Data("优秀(90-100)", Double.valueOf(data1)),
- new PieChart.Data("良好(80-89)", Double.valueOf(data2)),
- new PieChart.Data("中等(70-79)", Double.valueOf(data3)),
- new PieChart.Data("及格(60-69)", Double.valueOf(data3)),
- new PieChart.Data("不及格(0-60)", Double.valueOf(data5))));
- }
- }