1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
| import java.io.IOException;
import java.util.Comparator;
import java.util.List;
import java.util.function.Function;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.chart.AreaChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.control.Button;
import javafx.scene.layout.VBox;
//import javafx.scene.layout.HBox;
//import javafx.scene.layout.StackPane;
//import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class Main extends Application {
private XYChart.Series series1, series2, series3; // les séries du graphique, en attribut
private NumberAxis xAxis;
private NumberAxis yAxis;
private static final String NOM_DU_FICHIER = "D:\\Doc\\java\\eq\\temperature\\src\\application\\cord.in";
@Override public void start(Stage stage) throws NumberFormatException, IOException {
stage.setTitle("Area Chart Sample");
series1 = new XYChart.Series();
series1.setName("Boule1");
series2 = new XYChart.Series();
series2.setName("Boule2");
series3 = new XYChart.Series();
series3.setName("Boule3");
List<XYChart.Data> data = ValueReading.loadPoints(NOM_DU_FICHIER);
long maxAbs = max(data,XYChart.Data<Long,Long>::getXValue);
long minAbs = min(data,XYChart.Data<Long,Long>::getXValue);
long pas = maxAbs/10;
xAxis = new NumberAxis(minAbs, maxAbs, pas); // min,max,pas de l'axe d'absicce
long maxOrd = max(data,XYChart.Data<Long,Long>::getYValue);
long minOrd = min(data,XYChart.Data<Long,Long>::getYValue);
yAxis = new NumberAxis(minOrd, maxOrd, 5);
refreshSeries(data);
final AreaChart<Number,Number> ac =
new AreaChart<>(xAxis,yAxis);
xAxis.setForceZeroInRange(true);
ac.setTitle("Temperature Monitoring (in Degrees C)");
Button btn = new Button();
btn.setText("Live Refresh ... ");
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
try {
refreshSeries(NOM_DU_FICHIER);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
btn.setTranslateX(600);
btn.setTranslateY(10);
// btn.setTranslateX(500);
// btn.setTranslateY(394);
VBox vbox = new VBox();
Scene scene = new Scene(vbox, 1500, 1000);
ac.getData().addAll(series1, series2, series3);
vbox.getChildren().addAll(btn, ac);
stage.setHeight(480);
stage.setWidth(800);
// primaryStage.show();
// Scene scene = new Scene(ac,800,600);
//scene.getStylesheets().add("areachartsample/Chart.css");
ac.setHorizontalZeroLineVisible(true);
// ac.getData().addAll(series1, series2, series3);
stage.setScene(scene);
stage.show();
}
private long max(List<XYChart.Data> data,Function<XYChart.Data,Long> function) {
return data.stream().map(function).max(Comparator.naturalOrder()).orElse(0L);
}
private long min(List<XYChart.Data> data, Function<XYChart.Data,Long> function) {
return data.stream().map(function).min(Comparator.naturalOrder()).orElse(0L);
}
private void refreshSeries(String filename) throws IOException {
List<XYChart.Data> data = ValueReading.loadPoints(filename);
refreshSeries(data);
refreshAxis(data);
}
private void refreshAxis(List<XYChart.Data> data) {
long maxAbs = max(data,XYChart.Data<Long,Long>::getXValue);
long minAbs = min(data,XYChart.Data<Long,Long>::getXValue);
xAxis.setLowerBound(minAbs);
xAxis.setUpperBound(maxAbs);
long maxOrd = max(data,XYChart.Data<Long,Long>::getYValue);
long minOrd = min(data,XYChart.Data<Long,Long>::getYValue);
yAxis.setLowerBound(minOrd);
yAxis.setUpperBound(maxOrd);
}
private void refreshSeries(List<XYChart.Data> data) throws IOException {
series1.getData().clear(); // on supprime toutes les données de series1
series2.getData().clear(); // on supprime toutes les données de series2
series3.getData().clear(); // on supprime toutes les données de series3
data.stream().limit(4).forEach(point-> series1.getData().add(point)); // première série (limit donne le nombre d'éléments à parcourir)
data.stream().skip(4).limit(4).forEach(point-> series2.getData().add(point)); // deuxième série (skip donne le nombre d'éléments qu'on "saute", qu'on ignore
data.stream().skip(8).limit(4).forEach(point-> series3.getData().add(point)); // troisième série
}
public static void main(String[] args) {
launch(args);
}
} |
Partager