Bonjour,
Je suis actuellement en stage de développement informatique et je rencontre un petit problème depuis quelques jours concernant l’utilisation de Javafx (utilisation de gestes multitouch) avec Java. La détection des mouvements de zoom et de défilement ne se font pas correctement lorsque mes composants javafx sont inclus dans une JFrame. Je pourrais tout faire en Javafx mais malheureusement je travaille sur une grosse application Java développé en swing. J’ai trouvé de nombreux tutoriels sur internet expliquant comment inclure du Javafx dans une JFrame mais pas sur la gestion des évènements de Javafx dans une JFrame.
Ma question est donc la suivante : Est-il possible de détecter ces mouvements lorsque ces composants sont inclus dans un JFXPanel lui-même inclus dans une JFrame ?
Je vous ai mis en fichier joints les 2 codes développés. Le premier contient un mix de Java et javafx et le deuxième contient uniquement du JavaFx.
Je vous remercie
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62 import javafx.application.Application; import javafx.beans.property.DoubleProperty; import javafx.beans.property.SimpleDoubleProperty; import javafx.event.EventHandler; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.input.ScrollEvent; import javafx.scene.input.ZoomEvent; import javafx.scene.paint.Color; import javafx.scene.text.Font; import javafx.scene.text.Text; import javafx.stage.Stage; public class JavaFX extends Application { final DoubleProperty zoomProperty = new SimpleDoubleProperty(200); public void start(Stage stage) throws Exception { Group root = new Group(); Scene scene = new Scene(root, Color.ALICEBLUE); final Text text = new Text(); text.setX(60); text.setY(150); text.setFont(new Font(25)); text.setText("Mon Composant"); root.getChildren().add(text); scene.setOnZoom(new EventHandler<ZoomEvent>(){ public void handle(ZoomEvent event) { text.setFont(new Font(text.getFont().getSize()*event.getZoomFactor())); } }); text.addEventHandler(ScrollEvent.ANY, new EventHandler<ScrollEvent>() { public void handle(ScrollEvent event) { text.setTranslateX(text.getTranslateX() + ((ScrollEvent) event).getDeltaX()); text.setTranslateY(text.getTranslateY() + ((ScrollEvent) event).getDeltaY()); } }); stage.setScene(scene); stage.setWidth(300); stage.setHeight(300); stage.show(); } public static void main(String[] args) { launch(args); } }
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
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 import javafx.application.Platform; import javafx.embed.swing.JFXPanel; import javafx.event.EventHandler; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.control.ScrollPane; import javafx.scene.input.ScrollEvent; import javafx.scene.input.ZoomEvent; import javafx.scene.paint.Color; import javafx.scene.text.Font; import javafx.scene.text.Text; import javax.swing.JFrame; import javax.swing.SwingUtilities; //Javafx dans une Jframe public class JavaFXJFrame { static Text text = new Text("Hello World"); static ScrollPane scrollPane; private static void initAndShowGUI() { // Création de la JFrame JFrame frame = new JFrame("FX"); // Panel permettant d'inclure les composants JavaFX final JFXPanel fxPanel = new JFXPanel(); frame.add(fxPanel); frame.setVisible(true); frame.setSize(300, 300); frame.setLocationRelativeTo(null); Platform.runLater(new Runnable() { public void run() { initFX(fxPanel); } }); } private static void initFX(JFXPanel fxPanel) { Scene scene = createScene(); fxPanel.setScene(scene); } // Creation de la scène private static Scene createScene() { Group root = new Group(); final Text text = new Text(); text.setX(60); text.setY(150); text.setFont(new Font(25)); text.setText("Mon Composant"); root.getChildren().add(text); Scene scene = new Scene(root, Color.ALICEBLUE); // Ajout du listener Zoom. Problème de non détection de l'évenement scene.setOnZoom(new EventHandler<ZoomEvent>(){ public void handle(ZoomEvent event) { text.setFont(new Font(text.getFont().getSize()*event.getZoomFactor())); } }); // Ajout du listener de défilement. Problème il faut effectuer le geste du zoom pour que l'évenement soit pris en compte text.addEventHandler(ScrollEvent.ANY, new EventHandler<ScrollEvent>() { public void handle(ScrollEvent event) { text.setTranslateX(text.getTranslateX() + ((ScrollEvent) event).getDeltaX()); text.setTranslateY(text.getTranslateY() + ((ScrollEvent) event).getDeltaY()); } }); return scene; } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { initAndShowGUI(); } }); } }
Partager