(JavaFX 版)综合性实验 学生成绩分析程序

内容要求:

综合性实验 学生成绩分析程序

实验类型:综合性

实验目的:综合运用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



代码如下:

[java]  view plain copy
  1. package studentsgradesanalyzer;  
  2.   
  3. /** 
  4.  * 
  5.  * @author acerr 
  6.  */  
  7. import javafx.application.Application;  
  8. import javafx.scene.Scene;  
  9. import javafx.stage.Stage;  
  10. import javafx.scene.layout.*;  
  11.   
  12. public class StudentsGradesAnalyzer extends Application{  
  13.           
  14.     /** 
  15.      * @param args the command line arguments 
  16.      */  
  17.     @Override  
  18.     public void start(Stage primaryStage) {  
  19.         BorderPane primaryBorderPane=new BorderPane();//最外面板  
  20.           
  21.         BorderPane borderPane=new BorderPane();//文件面板,  
  22.           
  23.         FileMenu fileMenu=new FileMenu();//定义文件菜单实例  
  24.           
  25.         borderPane.setTop(fileMenu.addMenu());//添加文件菜单模块  
  26.         borderPane.setCenter(fileMenu.getCheckNode());//添加输入查询模块  
  27.           
  28.         primaryBorderPane.setTop(borderPane);  
  29.         primaryBorderPane.setCenter(fileMenu.getGradesTable());//添加成绩单模块  
  30.         primaryBorderPane.setRight(fileMenu.getDataAnalyzer());  
  31.         primaryBorderPane.setBottom(fileMenu.getTextPath());  
  32.           
  33.           
  34.         primaryStage.setScene(new Scene(primaryBorderPane,666,450));  
  35.         primaryStage.setTitle("StudentsGradesAnalyzer");  
  36.         primaryStage.show();  
  37.     }  
  38.     public static void main(String[] args) {  
  39.         // TODO code application logic here  
  40.         launch(args);  
  41.     }  
  42.       
  43. }  

[java]  view plain copy
  1. package studentsgradesanalyzer;  
  2.   
  3. /** 
  4.  * 文件菜单 
  5.  * 
  6.  * @author acerr 
  7.  */  
  8. import java.io.BufferedReader;  
  9. import java.io.EOFException;  
  10. import javafx.scene.control.Menu;  
  11. import javafx.scene.control.MenuBar;  
  12. import javafx.scene.control.MenuItem;  
  13. import javafx.stage.FileChooser;  
  14. import javafx.stage.FileChooser.ExtensionFilter;  
  15. import java.io.File;  
  16. import java.io.FileInputStream;  
  17. import java.io.FileNotFoundException;  
  18. import java.io.FileOutputStream;  
  19. import java.io.IOException;  
  20. import java.io.InputStreamReader;  
  21. import java.io.ObjectInputStream;  
  22. import java.io.ObjectOutputStream;  
  23. import java.io.PrintWriter;  
  24. import java.io.UnsupportedEncodingException;  
  25. import java.util.logging.Level;  
  26. import java.util.logging.Logger;  
  27. import javafx.scene.control.TextField;  
  28. import javafx.scene.layout.HBox;  
  29. import javafx.scene.paint.Color;  
  30. import javafx.scene.text.Font;  
  31. import javafx.scene.text.Text;  
  32.   
  33. public class FileMenu {  
  34.   
  35.     private final MenuItem miOpenGrades = new MenuItem("打开文本文件成绩单"), miSaveGrades = new MenuItem("另存为文本文件成绩单"),  
  36.             miOpenObjectGrades = new MenuItem("打开对象文本文件成绩单"), miSaveObjectGrades = new MenuItem("另存为对象文本文件成绩单"),  
  37.             miClean = new MenuItem("清除数据");  
  38.   
  39.     private final Menu menu = new Menu("文件");  
  40.   
  41.     private final GradesTable gradesTable = new GradesTable();//定义成绩单实例  
  42.     private final DataAnalyzer dataAnalyzer = new DataAnalyzer();//定义数据分析实例  
  43.     private final TextField tfCheck = new TextField();//输入查询文本框  
  44.     private final Text textPath = new Text();  
  45.     private final String path = new String();//文件路径  
  46.   
  47.     FileMenu() {  
  48.   
  49.     }  
  50.   
  51.     public final MenuBar addMenu() {  
  52.         //文件菜单  
  53.         MenuBar mb = new MenuBar();  
  54.   
  55.         mb.getMenus().add(menu);  
  56.   
  57.         menu.getItems().addAll(miOpenGrades, miSaveGrades, miOpenObjectGrades, miSaveObjectGrades, miClean);  
  58.   
  59.         //打开文本文件成绩单  
  60.         miOpenGrades.setOnAction(e -> {  
  61.             openGrades();  
  62.   
  63.         });  
  64.   
  65.         //保存文本文件成绩单  
  66.         miSaveGrades.setOnAction(e -> {  
  67.             saveGrades();  
  68.         });  
  69.   
  70.         //打开对象文本文件  
  71.         miOpenObjectGrades.setOnAction(e -> {  
  72.             openObjectGrades();  
  73.         });  
  74.   
  75.         //保存对象文本文件  
  76.         miSaveObjectGrades.setOnAction(e -> {  
  77.             try {  
  78.                 saveObjectGrades();  
  79.             } catch (IOException ex) {  
  80.                 Logger.getLogger(FileMenu.class.getName()).log(Level.SEVERE, null, ex);  
  81.             }  
  82.         });  
  83.   
  84.         //清除数据  
  85.         miClean.setOnAction(e -> {  
  86.             gradesTable.cleanData();  
  87.             dataAnalyzer.setTfData("""""""""""""""""""""""""");  
  88.             textPath.setText("");  
  89.             tfCheck.setText("");  
  90.         });  
  91.         return mb;  
  92.     }  
  93.   
  94.     //由于需要在这个类读取文件,所以在此定义成绩单的实例,并返回  
  95.     public GradesTable getGradesTable() {  
  96.         return gradesTable;  
  97.     }  
  98.   
  99.     //返回DataAnayzer的实例  
  100.     public DataAnalyzer getDataAnalyzer() {  
  101.         return dataAnalyzer;  
  102.     }  
  103.   
  104.     //返回输入查询节点  
  105.     public HBox getCheckNode() {  
  106.         HBox hBox = new HBox();  
  107.         Text text = new Text("  输入学号或姓名或成绩,然后打回车可查询,点击表格列头可排序       ");  
  108.         text.setFill(Color.RED);  
  109.         text.setFont(Font.font(15));  
  110.         hBox.getChildren().addAll(tfCheck, text);  
  111.   
  112.         tfCheck.setPromptText("输入字段,打回车键查询");  
  113.         tfCheck.setOnAction(e -> {  
  114.             gradesTable.updateFilterGrades(tfCheck.getText());  
  115.             analyzeData();  
  116.         });  
  117.         return hBox;  
  118.     }  
  119.   
  120.     //返回文件路径  
  121.     public Text getTextPath() {  
  122.         textPath.setVisible(true);  
  123.         return textPath;  
  124.     }  
  125.   
  126.     //分析数据  
  127.     public void analyzeData() {  
  128.         if (gradesTable.getObservableList().isEmpty()) {//若数据为空  
  129.             dataAnalyzer.setTfData("""""""""""""""""""""""""");  
  130.             return;  
  131.         }  
  132.         //计算  
  133.         gradesTable.calculate();  
  134.         //显示分析数据  
  135.         dataAnalyzer.setTfData(gradesTable.getHightestGrade(), gradesTable.getLowestGrade(), gradesTable.getAverageGrade(),  
  136.                 gradesTable.getOutStandingNumber(), gradesTable.getOutstandingPercent(), gradesTable.getGoodNumber(),  
  137.                 gradesTable.getGoodPercent(), gradesTable.getMediumNumber(), gradesTable.getMediumPercent(),  
  138.                 gradesTable.getPassNumber(), gradesTable.getPassPercent(), gradesTable.getNotPassNumber(),  
  139.                 gradesTable.getNotPassPercent());  
  140.     }  
  141.   
  142.     //打开文本文件  
  143.     public void openGrades() {  
  144.         FileChooser fileChooser = new FileChooser();//选择文件控件  
  145. //            fileChooser.setInitialDirectory(//初始路径  
  146. //                    new File(System.getProperty("user.home"))  
  147. //            );  
  148.   
  149.         fileChooser.getExtensionFilters().addAll(//添加过滤器  
  150.                 new ExtensionFilter("文本文件成绩单(*.txt)""*.txt"),  
  151.                 new ExtensionFilter("所有文件""*.*")  
  152.         );  
  153.   
  154.         File file = fileChooser.showOpenDialog(null);  
  155.   
  156.         if (file != null && file.getName().endsWith(".txt")) {  
  157.             try {  
  158.                 gradesTable.cleanData();  
  159.                 InputStreamReader read = new InputStreamReader(new FileInputStream(file), "utf-8");//考虑utf-8编码  
  160.                 BufferedReader bufferedReader = new BufferedReader(read);  
  161.                 String str = new String();  
  162.                 while ((str = bufferedReader.readLine()) != null) {  
  163.                     if (str.trim().length() > 0) {//排除空行  
  164.                         gradesTable.addGrades(str);  
  165.                     }  
  166.                 }  
  167.                 read.close();  
  168.   
  169.             } catch (FileNotFoundException ex) {  
  170.                 System.out.println("File is not exit");  
  171.                 ex.printStackTrace();  
  172.             } catch (IOException ex) {  
  173.                 Logger.getLogger(FileMenu.class.getName()).log(Level.SEVERE, null, ex);  
  174.             }  
  175.             //分析数据  
  176.             analyzeData();  
  177.             textPath.setText(file.getPath() + "\\" + gradesTable.getPeopleSum() + "人");  
  178.         } else {  
  179.             System.out.println("打开文件错误");  
  180.         }  
  181.     }  
  182.   
  183.     //保存文本文件  
  184.     public void saveGrades() {  
  185.         FileChooser fileChooser = new FileChooser();  
  186.         fileChooser.getExtensionFilters().addAll(//添加过滤器  
  187.                 new ExtensionFilter("文本文件成绩单(*.txt)""*.txt"),  
  188.                 new ExtensionFilter("所有文件""*.*")  
  189.         );  
  190.         fileChooser.setInitialFileName("Grades.txt");//设置默认文件名  
  191.         File file = fileChooser.showSaveDialog(null);  
  192.         if (file != null) {  
  193.   
  194.             try (PrintWriter output = new PrintWriter(file,"utf-8")) {//用utf-8写  
  195.   
  196.                 for (TableData data : gradesTable.getObservableList()) {  
  197.                     String str = data.getNumber() + "," + data.getName() + "," + data.getGrade();  
  198.                     output.println(str);  
  199.                 }  
  200. //                    output.close();//output要关闭,否则数据写入不成功,可改用try(PrintWriter output=new PrintWriter()){ ....}  
  201.                 System.out.println("保存成功");  
  202.             } catch (FileNotFoundException ex) {  
  203.                 System.out.println("保存文件文本成绩单错误");  
  204.                 ex.printStackTrace();  
  205.             }  catch (UnsupportedEncodingException ex) {  
  206.                 Logger.getLogger(FileMenu.class.getName()).log(Level.SEVERE, null, ex);  
  207.             }  
  208.         }  
  209.     }  
  210.   
  211.     //打开对象文本文件  
  212.     public void openObjectGrades() {  
  213.         FileChooser fileChooser = new FileChooser();//选择文件控件  
  214.   
  215.         fileChooser.getExtensionFilters().addAll(//添加过滤器  
  216.                 new ExtensionFilter("对象文本文件成绩单(*.dat)""*.dat"),  
  217.                 new ExtensionFilter("所有文件""*.*")  
  218.         );  
  219.   
  220.         File file = fileChooser.showOpenDialog(null);  
  221.   
  222.         if (file != null && file.getName().endsWith(".dat")) {  
  223.             try (ObjectInputStream input = new ObjectInputStream(new FileInputStream(file));) {//读取对象文件  
  224.                 gradesTable.cleanData();  
  225.                 while (true) {  
  226.                     String str = (String) input.readObject();//对象只能一次读一个,在保存对象文件时,可改保存一个字符串数组,再次读取时会读取一个字符串数组对象  
  227.                     System.out.println(str);  
  228.                     gradesTable.addGrades(str);  
  229.                 }  
  230.             } catch (EOFException e) {  
  231.                 //已从流中读完。,对while(true)抛出错误  
  232.             }catch (FileNotFoundException ex) {  
  233.                 System.out.println("File is not exit");  
  234.                 ex.printStackTrace();  
  235.             } catch (UnsupportedEncodingException ex) {  
  236.                 Logger.getLogger(FileMenu.class.getName()).log(Level.SEVERE, null, ex);  
  237.             } catch (IOException ex) {  
  238.                 Logger.getLogger(FileMenu.class.getName()).log(Level.SEVERE, null, ex);  
  239.             } catch (ClassNotFoundException ex) {  
  240.                 Logger.getLogger(FileMenu.class.getName()).log(Level.SEVERE, null, ex);  
  241.             }   
  242.               
  243.   
  244.             //分析数据  
  245.             analyzeData();  
  246.             textPath.setText(file.getPath() + "\\" + gradesTable.getPeopleSum() + "人");//文件路径  
  247.         } else {  
  248.             System.out.println("打开对象文件错误");  
  249.         }  
  250.     }  
  251.   
  252.     //保存对象文本文件  
  253.     public void saveObjectGrades() throws IOException {  
  254.         FileChooser fileChooser = new FileChooser();  
  255.         fileChooser.getExtensionFilters().addAll(//添加过滤器  
  256.                 new ExtensionFilter("文本文件成绩单(*.dat)""*.dat"),  
  257.                 new ExtensionFilter("所有文件""*.*")  
  258.         );  
  259.         fileChooser.setInitialFileName("Grades.dat");//设置默认文件名  
  260.         File file = fileChooser.showSaveDialog(null);  
  261.         if (file != null) {  
  262.             try (ObjectOutputStream output = new ObjectOutputStream(new FileOutputStream(file));) {  
  263.                 for (TableData data : gradesTable.getObservableList()) {  
  264.                     String str = data.getNumber() + "," + data.getName() + "," + data.getGrade();  
  265.                     output.writeObject(str);  
  266.   
  267.                 }  
  268.   
  269.                 System.out.println("保存成功");  
  270.             } catch (FileNotFoundException ex) {  
  271.                 System.out.println("保存对象文件文本成绩单错误");  
  272.                 ex.printStackTrace();  
  273.             }  
  274.         }  
  275.     }  
  276.   
  277. }  

[java]  view plain copy
  1. package studentsgradesanalyzer;  
  2.   
  3. import javafx.beans.property.SimpleStringProperty;  
  4.   
  5. /** 
  6.  *  数据模型 
  7.  * @author acerr 
  8.  */  
  9. public class TableData {  
  10.   
  11.         SimpleStringProperty number, name, grade;  
  12.   
  13.         public TableData(String number, String name, String grade) {  
  14.             this.number = new SimpleStringProperty(number);  
  15.             this.name = new SimpleStringProperty(name);  
  16.             this.grade = new SimpleStringProperty(grade);  
  17.         }  
  18.   
  19.         public String getNumber() {  
  20.             return number.get();  
  21.         }  
  22.   
  23.         public void setNumber(String number) {  
  24.             this.number.set(number);  
  25.         }  
  26.   
  27.         public String getName() {  
  28.             return name.get();  
  29.         }  
  30.   
  31.         public void setName(String name) {  
  32.             this.name.set(name);  
  33.         }  
  34.   
  35.         public String getGrade() {  
  36.             return grade.get();  
  37.         }  
  38.   
  39.         public void setGrade(String grade) {  
  40.             this.grade.set(grade);  
  41.         }  
  42.   
  43.     }  
  44.    

[java]  view plain copy
  1. package studentsgradesanalyzer;  
  2.   
  3. /** 
  4.  *  成绩单表格 
  5.  * @author acerr 
  6.  */  
  7. import javafx.scene.control.TableView;  
  8. import javafx.scene.control.TableColumn;  
  9. import javafx.collections.FXCollections;  
  10. import javafx.collections.ObservableList;  
  11. import javafx.beans.property.SimpleStringProperty;  
  12. import javafx.scene.control.cell.PropertyValueFactory;  
  13.   
  14. public class GradesTable extends TableView {  
  15.   
  16. //    private  TableView<tabledata> tableView=new TableView<>();  
  17.     private TableColumn tcNumber = new TableColumn("学号"), tcName = new TableColumn("姓名"), tcGrade = new TableColumn("成绩");  
  18.   
  19.     private final ObservableList<tabledata> olOriginalGrades = FXCollections.observableArrayList(),//为实现查询,保存原始数据  
  20.             olFilterGrades = FXCollections.observableArrayList();//过滤后的数据,注:由于需要用到动态的ObservableList,不要用static修饰  
  21.     private double hightestGrade = 0, lowesGrade = 0, averageGrade = 0, outStandingNumber = 0, outstandingPercent = 0, goodNumber = 0, goodPercent = 0,  
  22.             mediumNumber = 0, mediumPercent = 0, passNumber = 0, passPercent = 0, notPassNumber = 0, notPassPercent = 0, outstandingSum = 0, goodSum = 0,  
  23.             mediumSum = 0, passSum = 0, notPassSum = 0,peopleSum=0;  
  24.   
  25.     public GradesTable() {  
  26.         this(",".split("[,]"));  
  27.     }  
  28.   
  29.     public GradesTable(String[] strGrades) {  
  30.         getColumns().addAll(tcNumber, tcName, tcGrade);  
  31.         tcNumber.setCellValueFactory(new PropertyValueFactory<tabledata string="">("number"));  
  32.         tcName.setCellValueFactory(new PropertyValueFactory<tabledata string="">("name"));  
  33.         tcGrade.setCellValueFactory(new PropertyValueFactory<tabledata string="">("grade"));  
  34.         tcNumber.setMinWidth(110);  
  35.         tcName.setMinWidth(110);  
  36.         tcGrade.setMinWidth(110);  
  37.         addGrades(strGrades);  
  38.         setItems(olFilterGrades);//向表格添加数据  
  39.   
  40.     }  
  41.   
  42.     //添加数据  
  43.     public void addGrades(String[] strGrades) {  
  44.         for (String str : strGrades) {  
  45.             addGrades(str);  
  46.         }  
  47.     }  
  48.   
  49.     public void addGrades(String strGrade) {  
  50.         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) {  
  51.                 outStandingNumber++;  
  52.                 outstandingSum += grade;  
  53.             } else if (grade >= 80) {  
  54.                 goodNumber++;  
  55.                 goodSum += grade;  
  56.             } else if (grade >= 70) {  
  57.                 mediumNumber++;  
  58.                 mediumSum += grade;  
  59.             } else if (grade >= 60) {  
  60.                 passNumber++;  
  61.                 passSum += grade;  
  62.             } else {  
  63.                 notPassNumber++;  
  64.                 notPassSum += grade;  
  65.             }  
  66.   
  67.             if (grade > hightestGrade) {  
  68.                 hightestGrade = grade;  
  69.             }  
  70.             if (grade < lowesGrade) {  
  71.                 lowesGrade = grade;  
  72.             }  
  73.   
  74.         }  
  75.   
  76.         peopleSum = outStandingNumber + goodNumber + mediumNumber + passNumber + notPassNumber;  
  77.         averageGrade = (outstandingSum + goodSum + mediumSum + passSum + notPassSum) / peopleSum;  
  78.         outstandingPercent = outStandingNumber * 100.0 / peopleSum;  
  79.         goodPercent = goodNumber * 100.0 / peopleSum;  
  80.         mediumPercent = mediumNumber * 100.0 / peopleSum;  
  81.         passPercent = passNumber * 100.0 / peopleSum;  
  82.         notPassPercent = notPassNumber * 100.0 / peopleSum;  
  83.   
  84.     }  
  85.   
  86.     //过滤(查询)数据  
  87.     public void updateFilterGrades(String reserveString) {  
  88.         olFilterGrades.clear();  
  89.         if (reserveString.trim().length() < 1) {//如果保留字段为空  
  90.             olFilterGrades.addAll(olOriginalGrades);  
  91.             System.out.println("字段为空");  
  92.         } else {  
  93.             for (TableData data : olOriginalGrades) {  
  94.                 if (data.getNumber().contains(reserveString.trim()) || data.getName().contains(reserveString.trim())  
  95.                         || data.getGrade().contains(reserveString.trim())) {  
  96.                     olFilterGrades.add(data);  
  97.                 }  
  98.             }  
  99.         }  
  100.     }  
  101.       
  102.      //返回过滤后的数据  
  103.     public ObservableList<tabledata> getObservableList() {  
  104.         return olFilterGrades;  
  105.     }  
  106.       
  107.     public String getHightestGrade() {  
  108.         return String.format("%.2f", hightestGrade);  
  109.     }  
  110.   
  111.     public String getLowestGrade() {  
  112.         return String.format("%.2f", lowesGrade);  
  113.     }  
  114.   
  115.     public String getAverageGrade() {  
  116.         return String.format("%.2f", averageGrade);  
  117.     }  
  118.   
  119.     public String getOutStandingNumber() {  
  120.         return String.format("%.0f", outStandingNumber);  
  121.     }  
  122.   
  123.     public String getOutstandingPercent() {  
  124.         return String.format("%.2f", outstandingPercent);  
  125.     }  
  126.   
  127.     public String getGoodNumber() {  
  128.         return String.format("%.0f", goodNumber);  
  129.     }  
  130.   
  131.     public String getGoodPercent() {  
  132.         return String.format("%.2f", goodPercent);  
  133.     }  
  134.   
  135.     public String getMediumNumber() {  
  136.         return String.format("%.0f", mediumNumber);  
  137.     }  
  138.   
  139.     public String getMediumPercent() {  
  140.         return String.format("%.2f", mediumPercent);  
  141.     }  
  142.   
  143.     public String getPassNumber() {  
  144.         return String.format("%2.0f", passNumber);  
  145.     }  
  146.   
  147.     public String getPassPercent() {  
  148.         return String.format("%2.2f", passPercent);  
  149.     }  
  150.   
  151.     public String getNotPassNumber() {  
  152.         return String.format("%2.0f", notPassNumber);  
  153.     }  
  154.   
  155.     public String getNotPassPercent() {  
  156.         return String.format("%2.2f", notPassPercent);  
  157.     }  
  158.     //总人数  
  159.     public int getPeopleSum(){  
  160.         return olOriginalGrades.size();  
  161.     }  
  162. }   

[java]  view plain copy
  1. package studentsgradesanalyzer;  
  2.   
  3. /** 
  4.  *  数据分析 
  5.  * @author acerr 
  6.  */  
  7.   
  8. import javafx.geometry.Insets;  
  9. import javafx.geometry.Pos;  
  10. import javafx.scene.layout.GridPane;  
  11. import javafx.scene.layout.VBox;  
  12. import javafx.scene.layout.HBox;  
  13. import javafx.scene.control.Button;  
  14. import javafx.scene.control.Label;  
  15. import javafx.scene.control.TextField;  
  16. import javafx.stage.Stage;  
  17. import javafx.scene.Scene;  
  18. import javafx.scene.chart.*;  
  19. //import javafx.scene.chart.BarChart;  
  20. //import javafx.scene.chart.CategoryAxis;  
  21. //import javafx.scene.chart.NumberAxis;  
  22.   
  23. public class DataAnalyzer extends VBox {  
  24.   
  25.     private TextField tfHighestGrade = new TextField(), tfLowestGrade = new TextField(), tfAverageGrade = new TextField(), tfOutStandingNumber = new TextField(),  
  26.             tfOutstandingPercent = new TextField(), tfGoodNumber = new TextField(), tfGoodPercent = new TextField(), tfMediumNumber = new TextField(),  
  27.             tfMediumPercent = new TextField(), tfPassNumber = new TextField(), tfPassPercent = new TextField(), tfNotPassNumber = new TextField(),  
  28.             tfNotPassPercent = new TextField();  
  29.   
  30.     private Button btBarChart = new Button("显示柱形分析图"), btPieChart = new Button("显示饼形分析图");  
  31.   
  32.     private GridPane gridPane = new GridPane();  
  33.   
  34.   
  35.     public DataAnalyzer() {  
  36.   
  37.         //设置不可输入  
  38.         tfHighestGrade.setEditable(false);  
  39.         tfLowestGrade.setEditable(false);  
  40.         tfAverageGrade.setEditable(false);  
  41.         tfOutStandingNumber.setEditable(false);  
  42.         tfOutstandingPercent.setEditable(false);  
  43.         tfGoodNumber.setEditable(false);  
  44.         tfGoodPercent.setEditable(false);  
  45.         tfMediumNumber.setEditable(false);  
  46.         tfMediumPercent.setEditable(false);  
  47.         tfPassNumber.setEditable(false);  
  48.         tfPassPercent.setEditable(false);  
  49.         tfNotPassNumber.setEditable(false);  
  50.         tfNotPassPercent.setEditable(false);  
  51.   
  52.         //设置宽度  
  53.         tfHighestGrade.setMaxWidth(110);  
  54.         tfLowestGrade.setMaxWidth(110);  
  55.         tfAverageGrade.setMaxWidth(110);  
  56.         tfOutStandingNumber.setMaxWidth(110);  
  57.         tfOutstandingPercent.setMaxWidth(60);  
  58.         tfGoodNumber.setMaxWidth(110);  
  59.         tfGoodPercent.setMaxWidth(60);  
  60.         tfMediumNumber.setMaxWidth(110);  
  61.         tfMediumPercent.setMaxWidth(60);  
  62.         tfPassNumber.setMaxWidth(110);  
  63.         tfPassPercent.setMaxWidth(60);  
  64.         tfNotPassNumber.setMaxWidth(110);  
  65.         tfNotPassPercent.setMaxWidth(60);  
  66.   
  67.         //添加行  
  68.         gridPane.addRow(0new Label("最高分"), tfHighestGrade);  
  69.         gridPane.addRow(1new Label("最低分"), tfLowestGrade);  
  70.         gridPane.addRow(2new Label("平均分"), tfAverageGrade);  
  71.         gridPane.addRow(3new Label("优秀(90-100)"), tfOutStandingNumber, new Label("人,占"), tfOutstandingPercent, new Label("%"));  
  72.         gridPane.addRow(4new Label("良好(80-89)"), tfGoodNumber, new Label("人,占"), tfGoodPercent, new Label("%"));  
  73.         gridPane.addRow(5new Label("中等(70-79)"), tfMediumNumber, new Label("人,占"), tfMediumPercent, new Label("%"));  
  74.         gridPane.addRow(6new Label("及格(60-69)"), tfPassNumber, new Label("人,占"), tfPassPercent, new Label("%"));  
  75.         gridPane.addRow(7new Label("不及格(0-60)"), tfNotPassNumber, new Label("人,占"), tfNotPassPercent, new Label("%"));  
  76.   
  77.         gridPane.setVgap(10);  
  78.         gridPane.setHgap(5);  
  79.   
  80.         HBox hBox = new HBox();  
  81.         hBox.getChildren().addAll(btBarChart, btPieChart);  
  82.         hBox.setAlignment(Pos.CENTER);  
  83.         hBox.setSpacing(10);//设间距  
  84.         setMargin(gridPane, new Insets(10));//设置外边距  
  85.         getChildren().addAll(gridPane, hBox);  
  86.         setSpacing(10);//设间距  
  87.   
  88.         //显示饼形图,旋转效果  
  89.         Stage pieStage = new Stage();  
  90.         NewPieChart pieChart = new NewPieChart();  
  91.         pieStage.setScene(new Scene(pieChart));  
  92.         btPieChart.setOnAction(e -> {  
  93.             if (tfOutStandingNumber.getText().trim().length()>0) {  
  94.                 pieChart.setPieData(tfOutStandingNumber.getText(), tfGoodNumber.getText(), tfMediumNumber.getText(),  
  95.                         tfPassNumber.getText(), tfNotPassNumber.getText());  
  96.                 if (pieChart.getScene() != null) {  
  97.                     pieChart.getScene().setRoot(new VBox());//若已显示,新设根  
  98.                 }  
  99.                 pieStage.setScene(new Scene(pieChart));  
  100.                 pieStage.show();  
  101.             }  
  102.         });  
  103.   
  104.         //显示柱形图  
  105.         Stage barStage = new Stage();  
  106.         final CategoryAxis xAxis = new CategoryAxis();  
  107.         final NumberAxis yAxis = new NumberAxis();  
  108.         xAxis.setLabel("成绩");  
  109.         yAxis.setLabel("人数/(人)");  
  110.         NewBarChart barChart = new NewBarChart(xAxis, yAxis);  
  111.         barStage.setScene(new Scene(barChart));  
  112.         btBarChart.setOnAction(e -> {  
  113. //            barChart.setData("5", "5", "5", "5", "5");  
  114.             if (tfOutStandingNumber.getText().trim().length()>0) {//若分析数据不为空  
  115.                 if (barChart.getScene() != null) {  
  116.                     barChart.getScene().setRoot(new VBox());  
  117.                 }  
  118.                 barChart.setData(tfOutStandingNumber.getText(), tfGoodNumber.getText(), tfMediumNumber.getText(), tfPassNumber.getText(), tfNotPassNumber.getText());  
  119.                 barStage.setScene(new Scene(barChart));  
  120.                 barStage.show();  
  121.             }  
  122.         });  
  123.   
  124.     }  
  125.   
  126.     //显示分析数据  
  127.     public void setTfData(String hightestGrade, String lowesGrade, String averageGrade, String outStandingNumber, String outstandingPercent,  
  128.             String goodNumber, String goodPercent, String mediumNumber, String mediumPercent, String passNumber, String passPercent,  
  129.             String notPassNumber, String notPassPercent) {  
  130.         tfHighestGrade.setText(hightestGrade);  
  131.         tfLowestGrade.setText(lowesGrade);  
  132.         tfAverageGrade.setText(averageGrade);  
  133.         tfOutStandingNumber.setText(outStandingNumber);  
  134.         tfOutstandingPercent.setText(outstandingPercent);  
  135.         tfGoodNumber.setText(goodNumber);  
  136.         tfGoodPercent.setText(goodPercent);  
  137.         tfMediumNumber.setText(mediumNumber);  
  138.         tfMediumPercent.setText(mediumPercent);  
  139.         tfPassNumber.setText(passNumber);  
  140.         tfPassPercent.setText(passPercent);  
  141.         tfNotPassNumber.setText(notPassNumber);  
  142.         tfNotPassPercent.setText(notPassPercent);  
  143.     }  
  144.   
  145. }  
  146.   
  147.    

[java]  view plain copy
  1. package studentsgradesanalyzer;  
  2.   
  3. /** 
  4.  *  柱形图 
  5.  * @author acerr 
  6.  */  
  7. import javafx.scene.chart.*;  
  8. import javafx.collections.FXCollections;  
  9. import javafx.collections.ObservableList;  
  10.   
  11. public class NewBarChart extends BarChart{  
  12.     private XYChart.Series seriesOutstanding = new XYChart.Series(),seriesGood=new XYChart.Series(),seriesMedium=new XYChart.Series(),  
  13.             seriesPass=new XYChart.Series(),seriesNotPass=new XYChart.Series();//五个变量  
  14.       
  15.     final static String outstanding=new String("优秀(90-100)"),good=new String("良好(80-89)"),medium=new String("中等(70-79)"),  
  16.             pass=new String("及格(60-69)"),notPass=new String("不及格(0-60)");  
  17.   
  18.   
  19.   
  20.     public NewBarChart(Axis xAxis, Axis yAxis) {  
  21.         super(xAxis,yAxis);  
  22.         seriesOutstanding.setName(outstanding);  
  23.         seriesGood.setName(good);  
  24.         seriesMedium.setName(medium);  
  25.         seriesPass.setName(pass);  
  26.         seriesNotPass.setName(notPass);  
  27.         setData("0","0","0","0","0");  
  28.         getData().addAll(seriesOutstanding,seriesGood,seriesMedium,seriesPass,seriesNotPass);  
  29.           
  30.     }  
  31.       
  32.     public void setData(String data1,String data2,String data3,String data4,String data5){  
  33.         seriesOutstanding.getData().setAll(new XYChart.Data(outstanding,Double.valueOf(data1)));  
  34.         seriesGood.getData().setAll(new XYChart.Data(good,Double.valueOf(data2)));  
  35.         seriesMedium.getData().setAll(new XYChart.Data(medium,Double.valueOf(data3)));  
  36.         seriesPass.getData().setAll(new XYChart.Data(pass,Double.valueOf(data4)));  
  37.         seriesNotPass.getData().setAll(new XYChart.Data<>(notPass,Double.valueOf(data5)));  
  38.           
  39.     }  
  40.       
  41.      
  42. }  
  43.    

[java]  view plain copy
  1. package studentsgradesanalyzer;  
  2.   
  3. /** 
  4.  *  饼形图 
  5.  * @author acerr 
  6.  */  
  7. import javafx.scene.chart.*;  
  8. import javafx.collections.FXCollections;  
  9. import javafx.collections.ObservableList;  
  10. public class NewPieChart extends PieChart{  
  11.   
  12.     public NewPieChart() {  
  13.         super(FXCollections.observableArrayList(  
  14.                 new PieChart.Data("优秀(90-100)"5),  
  15.                 new PieChart.Data("良好(80-89)"5),  
  16.                 new PieChart.Data("中等(70-79)"5),  
  17.                 new PieChart.Data("及格(60-69)"5),  
  18.                 new PieChart.Data("不及格(0-60)"5)));  
  19.     }  
  20. //    String data1,String data2,String data3,String data4,String data5  
  21.     public void setPieData(String data1,String data2,String data3,String data4,String data5){  
  22.         super.setData(FXCollections.observableArrayList(  
  23.                 new PieChart.Data("优秀(90-100)", Double.valueOf(data1)),  
  24.                 new PieChart.Data("良好(80-89)", Double.valueOf(data2)),  
  25.                 new PieChart.Data("中等(70-79)", Double.valueOf(data3)),  
  26.                 new PieChart.Data("及格(60-69)", Double.valueOf(data3)),  
  27.                 new PieChart.Data("不及格(0-60)", Double.valueOf(data5))));  
  28.     }  
  29.       
  30. }  
  31.    



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值