IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaFX Discussion :

Utilisation d'événements tactiles JavaFX à l'intérieur d'une JFame


Sujet :

JavaFX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 3
    Par défaut Utilisation d'événements tactiles JavaFX à l'intérieur d'une JFame
    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();
     
    			}
    		});
    	}
    }
    Fichiers attachés Fichiers attachés

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 904
    Billets dans le blog
    54
    Par défaut
    Malheureusement je n'ai pas beaucoup testé le touch principalement a cause de manque de matériel et donc encore moins dans ce cas de figure (JavaFX dans Swing).
    Juste une chose, si c'est du JDK8, n'oublie pas que tu peux essayer l'inverse : insérer la partie Swing dans une application JavaFX. Peut-être cela fonctionnera-t-il mieux après (et j'insiste bien sur le peut-etre, ce n'est qu'une hypothèse).
    Si c'est du JDK7, par contre, pas le choix. Tu peux quand même tester ton application sur le JDK8 pour voir si le problème est également présent quand tu passes a cette version.

    Tu peux essayer de poster (en anglais) ton problème sur le forum OTN et également aller voir sur le Jira de JavaFX (inscription requise) si le problème est connu et a défaut le reporter (ici aussi en anglais).
    Par contre, si c'est du JDK7, il ne faut pas espérer voir un éventuel correctif de si tôt, Oracle est passé a fond sur JDK8/JavaFX8.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 3
    Par défaut
    Merci d'avoir pris attention à mon problème.
    Je travail sous Windows 7 avec Eclipse et le JDK8 fournit par Oracle. Tout reformater en JavaFX me parait lourd même si j'ai déjà envisagé cette possibilité. Je vais essayer de poster mon problème sur les liens que tu m'as donné en espérant avoir une réponse.

  4. #4
    Membre très actif
    Avatar de la.lune
    Homme Profil pro
    Directeur Technique
    Inscrit en
    Décembre 2010
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Comores

    Informations professionnelles :
    Activité : Directeur Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2010
    Messages : 548
    Par défaut
    Bon je suis comme boye je ne peux pas tester vu que je n'ai pas du matériel. Alors j'ai pensé à demander l'avis des expert JavaFX, je pourrais poser la question OTN mais je préférais une réponse très rapide vu que c'est une question clé. Alors je viens de poser la question sur la mailing-liste de OpenJFX et voici la réponse:
    Citation Envoyé par Anthony Petrov
    Citation Envoyé par Bilal Soidik
    Hi,
    Just I want to know if touch events are correctly supported in a JavaFX application embedded in Swing.
    Hi Bilal,

    No. This isn't possible at the moment because Swing doesn't support multi-touch. So we can't pass the multi-touch events to the JavaFX scene because there's simply nothing to pass.

    If your app requires multi-touch input, then your JavaFX scene should be added to a JavaFX Stage.
    Malheureusement
    Comme c'est dit il faut que la scène soit ajouté à un Stage pour que les événements tactiles fonctionnent.
    Il reste la question de la proposition de bouye que c'est possible d'ajouter du Swing dans JavaFX, mais là j'ai testé un peu je trouve que seuls les composant qui héritent de JComponent peuvent intégré dans un SwingNode, voici la signature la méthode d'ajout du composant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void setContent(final JComponent content)
    Alors pas de possibilité d'ajouter un JFrame, il faut que ça soit des JPanel, JSplitPane, JButton, JMenuBar, JMenu, JLabel...

    Ainsi, au cas tu penserais à une migration alors l'effort de ce travail dépendra de la structure de l'application. Dans tous les cas il est possible de la faire migrer en entier, mais la question reste quel est la manière la plus simple et moins pénible, donc soit toute l'interface principale se trouve dans un JPanel donc facile à porter sur la scene ou découper et intégrer les composant groupés séparément car on peut avoir plusieurs SwingNode dans la même scene. Et je tiens à noté qu'il n y a pas d'erreur si on veut ouvrir des Dialog qui sont en swing car on les ajoute pas à la scene mais on les ouvrir séparément dans un autre thread.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 3
    Par défaut
    C'est ce que je craignais. Je sais ce qui me reste à faire, tout retranscrire en JavaFX.
    Merci pour vos réponses

Discussions similaires

  1. Comment utiliser l'évènement de triple click
    Par croquignole dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 27/11/2007, 08h31
  2. Utiliser un écran tactile
    Par ceidre dans le forum Delphi
    Réponses: 4
    Dernier message: 17/10/2006, 22h04
  3. [C#] utilisation d'évênements [nouveau problème]
    Par legillou dans le forum Windows Forms
    Réponses: 10
    Dernier message: 18/08/2006, 09h37
  4. Réponses: 5
    Dernier message: 09/05/2006, 11h03
  5. [COM] Comment utiliser les événements Word ?
    Par Laurent Dardenne dans le forum API, COM et SDKs
    Réponses: 7
    Dernier message: 30/05/2004, 12h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo