Suggest a feature
×

Welcome to TagMyCode

Please login or create account to add a snippet.
0
0
 
0
Added: Jun 20, 2021 5:43 PM
Modified: Jun 20, 2021 5:45 PM
Views: 43
Tags: javafx
  1. import javafx.application.*;
  2. import javafx.scene.*;
  3. import javafx.scene.canvas.*;
  4. import javafx.scene.paint.Color;
  5. import javafx.scene.shape.StrokeLineCap;
  6. import javafx.scene.shape.StrokeLineJoin;
  7. import javafx.scene.text.Font;
  8. import javafx.stage.*;
  9.  
  10. import java.io.IOException;
  11. import java.nio.file.Files;
  12. import java.nio.file.Path;
  13. import java.nio.file.Paths;
  14. import java.util.ArrayList;
  15. import java.util.HashSet;
  16. import java.util.Set;
  17.  
  18. // MainApp durch den eigenen Dateinamen ersetzen
  19. public class Main extends Application {
  20.     Canvas canvas;  // Zeichenbereich
  21.  
  22.     public static void main(String[] args) {
  23.         launch(args);
  24.     }
  25.  
  26.     @Override
  27.     public void start(Stage primaryStage) {
  28.         primaryStage.setTitle("Grafik mit JavaFX");
  29.         canvas = new Canvas(1600, 1000);
  30.         var root = new Group();
  31.         root.getChildren().add(canvas);
  32.         primaryStage.setScene(new Scene(root));
  33.         primaryStage.setResizable(false);
  34.         primaryStage.show();
  35.         // todo: eigene Methode statt drawShapes() aufrufen
  36.         drawShapes();
  37.  
  38.     }
  39.  
  40.     // im Canvas zeichnen
  41.     private void drawShapes() {
  42.         var gc = canvas.getGraphicsContext2D();
  43.         double w = canvas.getWidth();
  44.         double h = canvas.getHeight();
  45.  
  46.         // falls Hintergrund != weiß
  47.         // gc.setFill(Color.GRAY);
  48.         // gc.fillRect(0, 0, w, h);
  49.  
  50.  
  51.         // Hintergrund färben
  52.         gc.setFill(Color.BLACK);
  53.         gc.fillRect(0,0,w,h);
  54.  
  55.         double barwidth = w - 80;
  56.         // 6 Fragen h / 7 --> 7 Fragen h / 8
  57.         double barheight = h/7 - 10.0;
  58.  
  59.         var csvdata = readcsv();
  60.  
  61.  
  62.         double y0 = 40.0;
  63.         double x0 = 40.0;
  64.         double red, green;
  65.         for (int i = 0; i < 6; i++) {
  66.  
  67.  
  68.             int finalI = i;
  69.  
  70.  
  71.             var perc = csvdata.stream()
  72.                     .filter(itm -> itm.isValid)
  73.                     .mapToDouble(itm -> itm.percentages[finalI])
  74.             // wir wissen nicht was die Anzahl ist
  75.                     .average()
  76.                     .getAsDouble();
  77.  
  78.             gc.setFill(Color.GRAY);
  79.             gc.fillRect(x0, y0 + i * (barheight + 10), barwidth, barheight);
  80.  
  81.             // todo: neue Farben
  82.             if(perc < 50){
  83.                 red = 1.0;
  84.                 green = 0;
  85.             }else{
  86.                 green = (perc - 50)/50.0;
  87.                 red = 1.0 - green;
  88.             }
  89.  
  90.             var barcolor = new Color (red, green, 0,1.0);
  91.             gc.setFill(barcolor);
  92.             gc.setLineWidth(3);
  93.             gc.strokeRect(x0, y0 + i * (barheight + 10), barwidth*perc/100, barheight);
  94.             gc.fillRect(x0, y0 + i * (barheight + 10), barwidth*perc/100, barheight);
  95.  
  96.             // todo: Balken beschriften
  97.             gc.setFill(Color.WHITE);
  98.             gc.setFont(Font.font("Ubuntu", 32));
  99.             gc.fillText(String.format("%d%%", ((int)perc)),
  100.                     x0 + 20,
  101.                     y0 + i * (barheight + 10) + barheight * 0.65);
  102.         }
  103.  
  104.     }
  105.  
  106.     public Set<EvaluationRecord> readcsv(){
  107.         var result = new HashSet<EvaluationRecord>();
  108.  
  109.         try{
  110.             Path p = Paths.get("evaluation.csv");
  111.             // Neuer Pfad, dann alle Zeilen lesen von path
  112.             var lines = Files.readAllLines(p);
  113.  
  114.             for(var line : lines){
  115.                 result.add(new EvaluationRecord(line));
  116.             }
  117.         } catch (IOException e){
  118.             System.out.println("Pfad doest not exist");
  119.             e.printStackTrace();
  120.         }
  121.         return result;
  122.  
  123.     }
  124. }
  125.  
  126. import java.time.LocalDate;
  127. import java.util.Arrays;
  128. import java.util.Objects;
  129.  
  130. public class EvaluationRecord {
  131.     int matrNr = 0;
  132.     String evalDate = "";
  133.     int[] percentages = new int[6];
  134.     boolean isValid = false;
  135.  
  136.     // Konstruktur
  137.     public EvaluationRecord(String data) {
  138.         var items = data.split(";");
  139.         if(items.length != 8)
  140.             return;  // falsche Anzahl von durch ; getrennten Elementen
  141.         try {
  142.             matrNr = Integer.parseInt(items[0]);   // erstes Element: Matrikelnummer
  143.             if (matrNr < 1000000 || matrNr > 9_999_999)
  144.                 return;  // falsche Matrikelnummer, Abbruch
  145.             evalDate = LocalDate.parse(items[1]).toString();  // zweites Element: Datum der Evaluierung
  146.             for(int i=0; i<6; i++) {   // drittes bis achtes Element: Prozentzahlen
  147.                 int perc = Integer.parseInt(items[i+2]);
  148.                 if (perc<0 || perc>100) // Zahlenbereich testen
  149.                     return; // Abbruch, falscher Prozentwert
  150.                 percentages[i] = perc;
  151.             }
  152.         } catch (Exception e) {
  153.             System.out.println("Fehler in Konstruktor von EvaluationRecord");
  154.             System.out.println("Daten: " + data);
  155.             // e.printStackTrace();
  156.             return;  // Record ist fehlerhaft, aber Programm läuft weiter
  157.         }
  158.         isValid = true;
  159.     }
  160.  
  161.     // die folgenden 3 Methoden: erzeugt durch IntelliJ mit Code -> Generate,
  162.     // wobei bei equals + hashCode nur die Eigenschaft matrNr berücksichtigt wird
  163.     @Override
  164.     public boolean equals(Object o) {
  165.         if (this == o) return true;
  166.         if (o == null || getClass() != o.getClass()) return false;
  167.         EvaluationRecord that = (EvaluationRecord) o;
  168.         return matrNr == that.matrNr;
  169.     }
  170.  
  171.     @Override
  172.     public int hashCode() {
  173.         return Objects.hash(matrNr);
  174.     }
  175.  
  176.     @Override
  177.     public String toString() {
  178.         return "EvaluationRecord{" +
  179.                 "matrNr=" + matrNr +
  180.                 ", evalDate='" + evalDate + '\'' +
  181.                 ", percentages=" + Arrays.toString(percentages) +
  182.                 ", isValid=" + isValid +
  183.                 '}';
  184.     }
  185. }
  186.  
  187.  
  188.