Bonjour,
Je viens vous embêter avec un petit problème sur une application que j'ai créée pour m'amuser et découvrir un peu les graphiques sous JAVAFX. Cette application est un graphique qui recense le nombre de ... cigarettes fumées ... sur une semaine (j'ai juste mis deux semaines dans la base de données). Il y a deux graphiques, correspondant à chaque semaine. Le fait est que lorsque l'on passe sur un point du graphique, je souhaite afficher une vbox qui contient le nombre de cigarettes et la date exacte. Ceci est mis en place mais le problème est qu'il faut passer deux fois sur le point pour que cela s'affiche (la première fois ça marche pas, après cela marche). La première fois, j'ai trois petits points.
Ci-dessous le code.
Tout d'abord, la récupération des informations d'une série (désolé pour les noms rapides des variables ^^):
Ensuite, la méthode de mise en place des évenements
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 String[] lsTitles; CategoryAxis xAxis; NumberAxis yAxis; Calendar cal = Calendar.getInstance(); int w = cal.get(Calendar.WEEK_OF_YEAR); w--; //j'ai démarré il y a une semaine donc j'ai du reculer un peu ^^ XYChart.Series<String,Number> series = new XYChart.Series<String,Number>(); List<CigVinz> lsCV = Bdd.getCig("w", ""+ w); //ici je fais les opérations via peek et je récupère en optional la date minimale pour la mettre en légende Optional<Date> minDate = lsCV.stream().peek(ee -> { Data<String,Number> tempd = new XYChart.Data<String, Number>(Bdd.convertDateToDayOfWeek(ee.getJour()), ee.getNbCig()); Label lblDate = new Label("- Date : " + ee.getJour()); Label lblNb= new Label("- Nombre: " + ee.getNbCig()); Label[] tabLbl = { lblDate, lblNb}; VBox vv = new VBox(); tempd.setNode(vv); tempd.setExtraValue(tabLbl); series.getData().add(tempd); }).map(ee -> ee.getJour()).min(new java.util.Comparator<Date>(){ public int compare(Date d1, Date d2){ if(d1.before(d2)) return -1; else if (d1.after(d2)) return 1; else return 0; } }); lsTitles = Semaine.getTitreWeekFrmDate(minDate.get());
Et pour finir, une image présentant le problème.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 public static void setEvenement(LineChart<String, Number> lineChart, int numSer, CategoryAxis xAxis, NumberAxis yAxis ){ Set<Node> lsn = lineChart.lookupAll(".chart-line-symbol.series"+ numSer); lsn.stream().forEach( ee -> { VBox path = (VBox) ee; path.setOnMouseEntered(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent e) { if(path.getChildren().size() == 0) { NumberFormat df = NumberFormat.getInstance(); df.setRoundingMode(RoundingMode.HALF_DOWN); df.setMaximumFractionDigits(0); String valX = xAxis.getValueForDisplay(ee.getLayoutX()); Series<String, Number> tempser = lineChart.getData().get(numSer); ObservableList<Data<String,Number>> ol = tempser.getData(); FilteredList<Data<String,Number>> fl = ol.filtered(u -> (u.getXValue()).equals(valX)); Data<String, Number> dt = fl.get(0); Label[] tblbl = (Label[]) dt.getExtraValue(); path.getChildren().addAll(tblbl); path.autosize(); path.toFront(); } } }); path.setOnMouseExited(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent e) { path.getChildren().clear(); path.autosize(); } }); }); }
Je vous remercie d'avance pour votre aide.
Vinz
Partager