1 pièce(s) jointe(s)
Problème de cuisine: linechart et onMouseEntered sur node
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 ^^):
Code:
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()); |
Ensuite, la méthode de mise en place des évenements
Code:
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();
}
});
});
} |
Et pour finir, une image présentant le problème.
Pièce jointe 174274
Je vous remercie d'avance pour votre aide.
Vinz