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 :

custom Node avec fichier FXML


Sujet :

JavaFX

  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2007
    Messages : 643
    Points : 305
    Points
    305
    Par défaut custom Node avec fichier FXML
    D'après-vous comment peut-on lier ou gérer des Node créé nous même par des classes et méthode standard Java avec des fichiers FXML ?

    Doit-on forcement passer par un noeud root de type Group pour pouvoir ajouter un noeud à une scene (pas de methode getChildren().add() disponible quand root est un BorderPane FXML).

    Les attributs des objets FXML seront-ils des champs des classes de ces mêmes objets custom ?

    Merci pour vos éclairages

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Le nœud :
    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
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    package test;
     
    import javafx.beans.property.IntegerProperty;
    import javafx.beans.property.SimpleIntegerProperty;
    import javafx.scene.layout.Region;
     
    /**
     *
     * @author Fabrice
     */
    public class Foo extends Region {
     
        public Foo() {
            setStyle("-fx-background-color: red;");
        }
        private final IntegerProperty toto = new SimpleIntegerProperty(this, "toto", 0);
     
        public final void setToto(final int value) {
            toto.set(value);
        }
     
        public final int getToto() {
            return toto.get();
        }
     
        public final IntegerProperty totoProperty() {
            return toto;
        }
    }
    Noter la présence de la propriété toto.

    Le FXML :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?xml version="1.0" encoding="UTF-8"?>
     
    <?import java.lang.*?>
    <?import java.util.*?>
    <?import javafx.scene.*?>
    <?import javafx.scene.control.*?>
    <?import javafx.scene.layout.*?>
    <?import test.*?>
     
    <Foo id="AnchorPane" prefHeight="100" prefWidth="100" xmlns:fx="http://javafx.com/fxml" toto="3">
    </Foo>
    Noter l'accès à la propriété toto.

    Le test :
    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
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    package test;
     
    import com.javafx.experiments.scenicview.ScenicView;
    import javafx.application.Application;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.Scene;
    import javafx.scene.layout.AnchorPane;
    import javafx.scene.layout.AnchorPaneBuilder;
    import javafx.stage.Stage;
     
    /**
     *
     * @author Fabrice
     */
    public class Main extends Application {
     
        @Override
        public void start(Stage primaryStage) throws Exception {
            AnchorPane root = AnchorPaneBuilder.create().build();        
            Foo foo = (Foo) new FXMLLoader(getClass().getResource("Test.fxml")).load();
            root.getChildren().add(foo);        
            Scene scene = new Scene(root, 500, 500);        
            primaryStage.setTitle("Hello World!");
            primaryStage.setScene(scene);
            primaryStage.show();
            ScenicView.show(scene);
        }
     
        /**
         * The main() method is ignored in correctly deployed JavaFX 
         * application. main() serves only as fallback in case the 
         * application can not be launched through deployment artifacts,
         * e.g., in IDEs with limited FX support. NetBeans ignores main().
         * @param args the command line arguments
         */
        public static void main(String[] args) {
            launch(args);
        }
    }
    Le résultat :
    Nom : foo.jpg
Affichages : 589
Taille : 136,7 Ko
    Note : le noeud est orange car sélectionné dans ScenicView (orange = rouge surligné de jaune)

    Dans SceneBuilder :
    Nom : SceneBuilder1.jpg
Affichages : 563
Taille : 78,6 Ko
    Il faut configurer le classpath pour ajouter un lien vers une version compilée du nœud.

    Et ensuite :
    Nom : SceneBuilder2.jpg
Affichages : 569
Taille : 167,9 Ko
    Même la propriété toto apparaît et est éditable (tant qu'elle reste d'un type connu par SceneBuilder j'imagine).
    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
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2007
    Messages : 643
    Points : 305
    Points
    305
    Par défaut
    Ce que j'ai finalement du mal à comprendre n'est pas tant l'aspect static de la conception du code mais plutot l'aspect dynamique.

    A savoir si il est possible d'agir directement sur le FXML charger en mémoire par le loader ? J'aimerais pouvoir ajouter ou supprimer des noeuds à l'aide d'évènement d'autres noeuds capté par mon controller attaché à mon fichier FXML.

    Cela impliquerait une réécriture dynamique de fichier de base FXML qu'on re-soumettrait au FXMLLoader non ? Cela est-il possible ?

    Sinon il y a un mécanisme de hierarchy entre FXML chargé en mémoire ?

  4. #4
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    La structure est décrite statiquement dans le FXML ou statiquement/dynamiquement dans le code de la classe du nœud ou dans le code de son contrôleur (que je n'ai pas mis dans cet exemple unitaire car ça faisait redondant) au choix.

    Le FXML, c'est statique. Tout ce qu'il a a connaitre, c'est le type du noeud custom et ses propriété publiques, pas comment il est fait dedans.

    Dans la classe du nœud, tu peux rajouter ce que tu veux dans ton nouveau type pour créer le contenu statiquement ou dynamiquement. Si tu regardes des nœuds comme les graphes, ils créent dynamiquement une grande quantité de sous-nœuds via la méthode layoutPlotChildren() (que tu peux surcharger d'ailleurs pour ajouter des trucs dans un graphe), pour les autres type de nœud c'est plutôt dans layoutChildren().

    Tu peux aussi modifier cette structure à volonté une fois chargée en mémoire via le contrôleur (qui de fait connait le contenu du FXML via ses inclusions @FXML) ou n'importe quelle classe qui a accès au nœud racine (qui peut se permettre de faire des suppositions sur le contenu ou explorer cette même arborescence à la recherche d'ID précises) pour modifier/ajouter/retirer des nœuds/faire ce que tu veux/y compris rajouter de nouveaux listeners ici ou là.

    Tout ça, ça ne modifie pas le FXML pour autant : une fois chargée la structure arborescente n'a plus aucun lien direct avec son fichier d'origine.

    A noter que pour des nœud de contrôles UI, c'est plus pratique de dériver de Region quand tu veux en créer des nouveaux si tu ne veux pas avoir à gérer une partie du layout et de la gestion des sous-nœuds a mano. De plus, j'ai volontairement éviter de dériver de Control car une partie de l'API Skin / Behavior est encore privée et mal décrite (dans mon cas je n'ai jamais réussi à faire un contrôle qui fonctionne de manière correcte, entre autre quand il est redimensionnable, même si tu peux te baser sur ce qu'à fait Gerrit Grunwald dans ce domaine sur des contrôles de taille fixe).

    A noter que j'aurait très bien pu écrire le contenu de la structure du nœud custom Foo dans un FXML privé séparé (ex : FooUI.fxml), chargé par la classe Foo avec ou pas un contrôleur privé (ex : FooUIController) plutôt que dans le code de la classe. Ce FXML n'aurai eut aucun rapport direct avec le FXML principal de l'application de test, il est privé à mon nœud custom et sert en quelques sorte de Skin (et Behavior si on rajouter un contrôleur) sans passer par l'API idoine. Je ne l'ai pas fait ici pour garder le test simple.
    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

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2007
    Messages : 643
    Points : 305
    Points
    305
    Par défaut
    OK donc pas d’édition dynamique du FXML chargé en mémoire.
    La modification des nœuds et de la structure peut se faire en direct uniquement à travers le code et non du FXML.

    Ainsi je serais bien amené à développer graphiquement avec du code java au lieu d'avoir tout mon code graphique codé en FXML. Je pensais qu'il y avait 2 philosophies de codage mais qu'on n'en n'utilisait qu'une pour un projet.

    Je vais donc me tourner vers la gestion d'un Pane (ajout, suppression et modification de nœud contenu dans le Pane) de façon dynamique et donc à travers le code java dans mes contrôleurs ou autres classes.

    Je ne clos pas encore le sujet. Je vais traficoter un peu et reviendrai vers toi si j'ai des soucis avec un custom node utilisé ou ajouter de façon dynamique à mon Parent dans ma scene.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Bonjour,

    Je me permets poser une question concernant le sujet de "Custom Node" au lieu de d'ouvrir une nouvelle discussion, vous dites comment changer le class path pour le scene builder 1.1 (associé avec le JDK 1.7 maximum). Je travaille avec le scene builder 2.0 et le JDK 1.8, mais je n'arrive pas à savoir ou dois-je préciser le class path ?

    La solution que je trouvée est de le mettre dans le FXML avec la commande suivante, mais celle-ci ne fonctionne pas :

    <?scenebuilder-classpath-element ../../build/classes?>

    Cordialement

  7. #7
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    C'est différent dans SceneBuilder 2.0 : il faut empaqueter le nœud dans un fichier JAR et rajouter ce JAR dans la bibliothèque de SceneBuilder. Voir mon article Tutoriel sur une introduction au langage FXML. Par contre j'ai trouvé qu'au niveau des propriétés dans l'éditeur ça marche encore moins bien qu'avec SceneBuilder 1.1
    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

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Bonsoir, merci de votre réponse.

    Ça marche encore moins bien que Scene Builder 1.1, c'est à dire ?

    Mon objectif du custom personnalisé, est de créer une cellule qui va hériter de "Region" et dans mon objet cellule je vais ajouter un "Text".

    Je vais vouloir modifier le texte dans ma cellule à des moments précis, est-ce possible ?

  9. #9
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Je ne parle pas du composant en lui-même mais de ses propriétés customs (celles que tu as ajouté, pas celles dont il hérite) dans l'onglet inspector. Y en a qui n'apparaissent pas ou qui ne sont pas éditable et je n'ai franchement pas compris pourquoi. Pour le reste ça passe dans la même mesure que précédemment (souvent on a juste un carré tout gris qui s'affiche mais c'est suffisant pour le placer ou le redimensionner).
    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

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    On parfait.

    Merci beacoup

Discussions similaires

  1. Mettre a jour BD avec fichier csv
    Par Looping94510 dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 07/02/2005, 18h56
  2. Erreur avec fichier .manifest
    Par engi dans le forum Windows
    Réponses: 2
    Dernier message: 16/11/2004, 14h58
  3. [Eclipe 2.1.1]Projet avec fichiers sources existants
    Par mfofana dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 26/02/2004, 05h20
  4. Problème avec fichier texte
    Par jpdelx dans le forum ASP
    Réponses: 7
    Dernier message: 13/11/2003, 13h17
  5. Réponses: 4
    Dernier message: 25/08/2003, 09h02

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