Bonjour,

Je développe en JavaFX une interface graphique dans laquelle des séries de données sont affichées dans un graphique ("linechart").
J'ai besoin de créer une fonction qui permet à l'utilisateur de récupérer les coordonnées d'un point pour une série de données spécifique.
Cette fonction doit être désactivable.

Voici une brève description de la fonction que je souhaite développer. Lorsque l'utilisateur active cette option (en cliquant sur un bouton de l'interface) et déplace la souris sur le graphe, un trait vertical suit le déplacement de la souris. Lorsque l'utilisateur à cliqué sur un endroit du graphe, l’abscisse du point sélectionné est retournée au programme qui exploitera cette info.

Pour commencer, je veux simplement extraire les coordonnées d'un point correspondant à l'endroit où l'utilisateur a cliqué.
Pour cela, j'ai créé un bouton (boutonSelectedValueInGraph)qui gère l'appel et l'activation de cette fonction :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
boutonSelectedValueInGraph.setOnAction(new EventHandler<ActionEvent>() {
						@Override 
						public void handle(ActionEvent event) {
							UserSelectValue();
							x1BaselinetextInput.setText(selectedValue.toString());
						}
					});
"x1BaselinetextInput" correspond à un champ dans lequel l’abscisse du point choisi sera affiché. "selectedValue" contient l’abscisse du point. Étant donné que cette fonctionnalité sera employée à plusieurs reprises dans le code, j'ai créé une méthode qui est censée gérer l'extraction de cette valeur. Cette routine s'appelle "UserSelectValue()".

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
41
42
43
44
              private void UserSelectValue(){
					userSelectedValue = false;  // Variable servant à savoir si l'utilisateur a sélectionné ou non une valeur.
					selectedValue = null; // Variable dans laquelle est stockée la valeur sélectionnée par l'utilisateur.
 
					final Axis<Double> xAxis = graph.getXAxis();
					final Axis<Double> yAxis = graph.getYAxis();
 
					final Node chartBackground = graph.lookup(".chart-plot-background");
 
					// On actionne des eventHandler tant qu'une valeur n'a pas été sélectionné par l'utilsateur.
 
					for (Node n: chartBackground.getParent().getChildrenUnmodifiable()) {
						if (n != chartBackground && n != xAxis && n != yAxis) {
							n.setMouseTransparent(true);
						}
					}
 
					if (userSelectedValue == false){
 
						chartBackground.setOnMouseEntered(new EventHandler<MouseEvent>() {
							@Override public void handle(MouseEvent mouseEvent) {
								System.out.println("Mouse Entered");
								graph.setCursor(Cursor.HAND); //Change cursor to hand
							}
						});
 
						chartBackground.setOnMouseClicked(new EventHandler<MouseEvent>() {
							@Override public void handle(MouseEvent mouseEvent) {
								System.out.println("A data have been selected by the user !");
								selectedValue = Double.valueOf(xAxis.getValueForDisplay(mouseEvent.getX()));
								userSelectedValue = true;
								System.out.println("x : "+selectedValue);
 
							}
						});
 
						chartBackground.setOnMouseExited(new EventHandler<MouseEvent>() {
							@Override public void handle(MouseEvent mouseEvent) {
								System.out.println("Mouse Exited");
								graph.setCursor(Cursor.DEFAULT);
							}
						});
					}
				}
Pour que cette fonctionnalité soit activable ou désactivable à la demande, j'ai créé une variable "boolean userSelectedValue" qui au moment de lancer cette fonction vaut "false". Tant que l'utilisateur n'a pas sélectionné une valeur, cette valeur n'est pas modifiée.
Mon problème est que je ne trouve pas le moyen de désactiver cette fonctionnalité.
En plus de cela, le programme ne semble pas attendre que l'utilisateur sélectionne une valeur pour retourner la valeur stockée dans "selectedValue". Il me retourne donc "null", ce qui génére un message d'erreur dans la fenêtre de commande dès que je clique sur le bouton.

J'ai tenté de faire en sorte que la fonction "UserSelectValue()" retourne une valeur de type Double ou String, plutôt que d'être de type void.
Je déclare localement une variable "final String selected = new String();", mais je ne parviens pas à lui affecter une valeur dans
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
 
private String UserSelectValue(){
     final String selected = new String();
     ...
     chartBackground.setOnMouseClicked(new EventHandler<MouseEvent>() {
							@Override public void handle(MouseEvent mouseEvent) {
								System.out.println("A data have been selected by the user !");
								selectedValue = Double.valueOf(xAxis.getValueForDisplay(mouseEvent.getX()));
								selected=xAxis.getValueForDisplay(mouseEvent.getX()).toString();
								userSelectedValue = true;
								System.out.println("x : "+selectedValue);
 
							}
						});
     ...
     return selected;
}
Eclispe me signal une erreur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
The final local variable selected cannot be assigned, since it is defined in an enclosing type
Il semble que l’utilisation d'un if ne permet pas de désactiver cette commande. L’utilisation d'un boucle While ne fonctionne pas non plus.

Auriez vous une idée qui me permettrait de contourner ces problèmes pour que cette fonctionnalité soit activée uniquement entre le moment ou je clique sur le bouton jusqu'au moment où une valeur est sélectionnée ?

Comment faire en sorte que le programme attende que la valeur soit définie pour la retourner au programme ?

Merci d'avance.