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 :

Appel d'une méthode d'une classe javaFx dans une classe java


Sujet :

JavaFX

  1. #1
    Membre Expert
    Avatar de X-plode
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2005
    Messages
    682
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2005
    Messages : 682
    Par défaut Appel d'une méthode d'une classe javaFx dans une classe java
    Bonsoir à toutes et à tous,

    Voilà, je rencontre un problème de taille.

    J'ai un JTextArea que j'ai wrapper via une classe JavaFx.

    Le soucis est que, des opérations s'effectuent du coté de classes Java normal et je voudrais effectuer un append sur le JTextArea.

    Comment pourrais je accèder à mon composant ?

    Merci d'avance,

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 897
    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 897
    Billets dans le blog
    54
    Par défaut
    De la maniere habituelle, en conservant une reference dessus.

    Sinon pour repondre a la question initiale (voit pas trop le rapport entre le nom du sujet et ce que tu demandes), il te faut definir une interface Java qu'il te faut etendre en JavaFX. Apres tu peux passer une reference sur ton objet JavaFX dans du code Java en utilisant le type de l'interface et en appellant les methodes definies dedans.
    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 Expert
    Avatar de X-plode
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2005
    Messages
    682
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2005
    Messages : 682
    Par défaut
    De la maniere habituelle, en conservant une reference dessus.
    Le problème qui subsiste est que mes classes fx ne sont pas visible dans mes imports d'une classe java normale.

    Sinon pour repondre a la question initiale (voit pas trop le rapport entre le nom du sujet et ce que tu demandes)
    Mon problème est bien d'appeler une méthode d'une classe Fx dans une classe Java.
    Ou sinon de pouvoir directement appeler la méthode du composant déclarer dans notre classe fx.
    Dans le premier cas, je pourrais me débrouiller afin de setter mes valeurs. Le deuxième cas, se serait le mieux


    , il te faut definir une interface Java qu'il te faut etendre en JavaFX. Apres tu peux passer une reference sur ton objet JavaFX dans du code Java en utilisant le type de l'interface et en appellant les methodes definies dedans.
    Aurais-tu un bout de code à me donner comme exemple ( Je viens d'essayer et mon interface ne voit pas ma classe fx ) ?

    Car pour l'instant, je suis partie sur les scripts engine, pour faire de l'invocation de méthode via ScriptEngineManager et ScriptEngine.

    Merci d'avance,

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 897
    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 897
    Billets dans le blog
    54
    Par défaut
    Citation Envoyé par X-plode Voir le message
    Car pour l'instant, je suis partie sur les scripts engine, pour faire de l'invocation de méthode via ScriptEngineManager et ScriptEngine.
    AIE ! J'avoue que je ne suis pas passe trop sur ca sur la version interpretee... J'ai fait tous mes tests sur la version compilee et pour un exemple il ne faut pas aller voir plus loin que l'exemple dans lequel on met un listener JavaFX sur un composant Swing : http://www.developpez.net/forums/d65...x/#post4053074

    Hum as-tu fait des binding quand tu initialize ton moteur de script ? Je n'ai pas trop pousse l'experience loin mais si tu peux binder un objet Java tu peux alors lui passer la reference sur le JTextArea depuis ton script interprete, non ? Je vais voir si je peux faire quelques tests ce matin (cause occupe cette aprem).
    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
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 897
    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 897
    Billets dans le blog
    54
    Par défaut
    Yeah !!!!!!!!!!!!!
    J'ai fait que mes tests precedentss (fait pour tester le binding et l'appel de fonctions membre et statiques) etendent desormais DocumentListener et je les ajoute au Document du JTextArea qui est dans mon script. Et CA MARCHE !

    L'initialisation du moteur de script:
    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
     
        def bindings = scriptEngine.createBindings();
        // JX Bindings.
        bindings.put("now", new Date());
        bindings.put("out", java.lang.System.out);
        bindings.put("err", java.lang.System.err);
        bindings.put("testfx", new TestFX());
        bindings.put("testj", new TestJ());
        [...]
        def scriptContext = new SimpleScriptContext();
        [...]
        // Bug workaround.
        scriptContext.setBindings(bindings, ScriptContext.GLOBAL_SCOPE);
        scriptContext.setBindings(bindings, ScriptContext.ENGINE_SCOPE);
        scriptEngine.setContext(scriptContext);
    L'ecouteur en Java:
    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
     
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    package interpreter;
     
    import javax.swing.event.DocumentEvent;
    import javax.swing.event.DocumentListener;
     
    /**
     *
     * @author fabriceb
     */
    public class TestJ implements DocumentListener {
     
        public void doStuff(String s) {
            System.out.println("TestJ:doStuff: " + s);
        }
     
        public static void doStuffStatic(String s) {
            System.out.println("TestJ:doStuffStatic: " + s);
        }
     
        /**
         * {@inheritDoc}
         */
        @Override
        public void insertUpdate(DocumentEvent e) {
            System.out.println("TestJ:insertUpdate");
     
        }
     
        /**
         * {@inheritDoc}
         */
        @Override
        public void removeUpdate(DocumentEvent e) {
            System.out.println("TestJ:removeUpdate");
        }
     
        /**
         * {@inheritDoc}
         */
        @Override
        public void changedUpdate(DocumentEvent e) {
            System.out.println("TestJ:changedUpdate");
        }
    }
    L'ecouteur en JavaFX:
    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
     
    /*
     * Test.fx
     *
     * Created on Mar 2, 2009, 11:49:36 AM
     */
     
    package interpreter;
     
    import javax.swing.event.DocumentEvent;
    import javax.swing.event.DocumentListener;
     
        /**
        * @author fabriceb
         */
     
        public function doStuffStatic(s:String):Void {
            println("TestFX:doStuffStatic {s}");
        }
     
    public class TestFX extends DocumentListener {
        public function doStuff(s:String):Void {
            println("TestFX:doStuff {s}");
        }
     
        /**
        * {@inheritDoc}
        */
        public override function changedUpdate(e:DocumentEvent):Void {
            println("TestFX:changedUpdate");
        }
     
        /**
        * {@inheritDoc}
        */
        public override function insertUpdate(e:DocumentEvent):Void {
            println("TestFX:insertUpdate");
        }
     
        /**
        * {@inheritDoc}
        */
        public override function removeUpdate(e:DocumentEvent):Void {
            println("TestFX:removeUpdate");
        }
    }
    Ze interpreted script:
    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
     
    import javafx.stage.*;
    import javafx.scene.*;
    import javafx.ext.swing.*;
    import java.awt.*;
    import javax.swing.*;
     
    // Bind tests.
    println(now);
    testfx.doStuffStatic("Salut");
    testfx.doStuff("Salut");
    testj.doStuffStatic("Salut");
    testj.doStuff("Salut");
     
    // GUI.
    def area = new JTextArea();
    area.setText(now.toString());
    area.getDocument().addDocumentListener(testfx);
    area.getDocument().addDocumentListener(testj);
    def scroll = new JScrollPane(area);
    scroll.setPreferredSize(new Dimension(600, 400));
    def scrollNode = SwingComponent.wrap(scroll);
    var scene:Scene;
    def stage = Stage {
     title: "Test"; 
     override var width on replace {
       scrollNode.width = scene.width;
     }
     override var height on replace {
       scrollNode.height = scene.height;
     };
     scene: scene = Scene {
       content: scrollNode;
     }
    }
    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

  6. #6
    Membre Expert
    Avatar de X-plode
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2005
    Messages
    682
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2005
    Messages : 682
    Par défaut
    Salut,

    C'est super. Je sens que j'arrive au bout de mes peines

    Juste une dernière chose :
    L'initialisation du moteur de script, tu le mets où ?

    Et sinon, si j'ai bien compris ainsi, à chaque fois que la méthode de la classe java sera appelé, la valeur du JTextArea changera c'est bien ça ?
    ( Si c'est ça je dis : Yeah !!!!!!!!!!!!! too et milles mercis )

  7. #7
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 897
    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 897
    Billets dans le blog
    54
    Par défaut
    Dans mon cas le moteur de script est initialisé dans un programme JavaFX qui me permettait de tester les moteurs JavaFX et JavaScript dans JavaFX.

    Hum... pour faire l'effet inverse ???
    En passant par des closures peut-etre ? J'y réfléchirai plus tard, et en plus j'ai pas mon code à jour sous la main, faudra attendre lundi (ici c'est vendredi soir).

    Faudrai que tu donnes un peu plus de détails comme par exemple comment fonctionne ton programme et également les classes qui interragissent entre elles paske pour moi ta demande n'est pas trop claire depuis le début :

    - c'est du Java~Java qui essaie d'interpréter du JavaFX et d'interragir avec ?

    - c'est du JavaFX qui a des classes Java et qui essaie d'interpréter du JavaFX ?

    Chai pas clair ! Montre-moi un peu de code de tes propres essais STP.

    Au moins ça me permetrais de démarrer dans une bonne direction pour mes tests.
    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
    Membre Expert
    Avatar de X-plode
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2005
    Messages
    682
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2005
    Messages : 682
    Par défaut
    Merci pour ton aide en tout cas.

    Je fais un chat en javafx. Le probleme est que je gère mes flux avec un service et une gestion de flux par l'intermediaire d'un héritage de chaque par un thread.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    private class Service extends Thread{
    ...
    }
     
    private class GestionFlux extends Thread {
    ...
    }
    Du coté Fx, j'ai un wrapper d'un JTextArea pour l'insérer dans mon IHM ( qui est plus simple, je trouve, pour interagir avec ):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    public class JTextAreaWrapper extends SwingComponent {
        ...
        public var text: String on replace {
                area.append(text);
    	}
     
        public var action: function();
     
        public function addText(){
            area.append(addTextString);
        }
    }
    Donc d'un coté, j'ai mon IHM en javafx et mes fonctionnalités en java pour la gestion des sockets.

    Le problème est que le PrintWriter est dans mes threads et pour afficher les données reçus du réseau, je n'arrive pas à accèder à ma classe Wrapper (Fx).
    L'inverse Fx=>Java, marche nickel maintenant je dois faire un Java=>Fx pour lui donner les valeurs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public function addText(){
            area.append(addTextString);
        }

  9. #9
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 897
    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 897
    Billets dans le blog
    54
    Par défaut
    Je vais regarder ca de plus pres des que possible. Finallement je suis repasse au boulot car j'y avais oublie un trucs, donc voici le code qui lance l'interpreteur (quand le programme demarre l'interpreteur JavaFX c'est la seconde fenetre, celle du dessous ; tandis que la fenetre du dessus est un interpreteur JavaScript) :

    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
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
     
    /*
    * Main.fx
     *
     * Created on Feb 25, 2009, 8:12:41 AM
     */
     
    package interpreter;
     
    import interpreter.TestJ;
    import interpreter.Writer2TextComponent;
    import java.io.PrintWriter;
    import java.io.StringWriter;
    import java.lang.Exception;
    import java.lang.Object;
    import java.util.Date;
    import javafx.ext.swing.SwingButton;
    import javafx.scene.layout.VBox;
    import javafx.scene.Scene;
    import javafx.stage.Stage;
    import javax.script.ScriptContext;
    import javax.script.ScriptEngine;
    import javax.script.ScriptEngineFactory;
    import javax.script.ScriptEngineManager;
    import javax.script.SimpleScriptContext;
     
    /**
     * @author fabriceb
     */
    def scriptEngineManager = new ScriptEngineManager();
    def factories = scriptEngineManager.getEngineFactories();
    println("Available engines:");
    for (factory in factories) {
        println("Engine: {factory.getEngineName()} {factory.getEngineVersion()} / Language: {factory.getLanguageName()} {factory.getLanguageVersion()}");
        def engineNames = factory.getNames();
        println("\tAliases:");
        for(alias in engineNames) {
            println("\t\t{alias}");
        }
    }
    def languages = ["javafx", "javascript"];
    for (language in languages) {
        var scriptEngineManager: ScriptEngineManager = null;
        var scriptEngine: ScriptEngine = null;
        var scene: Scene;
        def editorNode: EditorNode = EditorNode {
            width: bind scene.width;
            height: bind scene.height - runButton.boundsInParent.height;
        }
        def runButton: SwingButton = SwingButton {
            text: "Run"
            action: function() {
                try {
                    editorNode.clearMessages();
                    def text = editorNode.scriptArea.getText();
                    runScript(language, text, editorNode);
                } catch (e:Exception) {
                    /*
                    var error = new StringWriter();
                     e.printStackTrace(new PrintWriter(error));
                     editorNode.errorArea.setText(error.toString());
                     editorNode.errorArea.setCaretPosition(0);
                     */
                    e.printStackTrace();
                }
            }
        };
        Stage {
            title: "Script interpreter {language}"
            width: 400;
            height: 600;
            scene: scene = Scene {
                    content: VBox {
                        content: [editorNode, runButton];
                    }
                }
        }
    }
     
    function initScriptEngine(language:String, editorNode:EditorNode):ScriptEngine {
        println("Initialization of the scripting engine.");
                    //var loader = Thread.currentThread().getContextClassLoader();
        //scriptEngineManager = new ScriptEngineManager(loader);
        //scriptEngine = scriptEngineManager.getEngineByName("ECMAScript");
        def scriptEngine = scriptEngineManager.getEngineByName(language);
            //var scriptEngine = scriptEngineManager.getEngineByExtension("fx");
        //scriptEngine = scriptEngineManager.getEngineByExtension("js");
        def bindings = scriptEngine.createBindings();
        // JX Bindings.
        bindings.put("now", new Date());
        bindings.put("out", java.lang.System.out);
        bindings.put("err", java.lang.System.err);
        bindings.put("testfx", new TestFX());
        bindings.put("testj", new TestJ());
        def scriptContext = new SimpleScriptContext();
        scriptContext.setWriter(new PrintWriter
            (new Writer2TextComponent(editorNode.outputArea, "Output:")));
        scriptContext.setErrorWriter(new PrintWriter
            (new Writer2TextComponent(editorNode.errorArea, "Error output:")));
        // Bug workaround.
        scriptContext.setBindings(bindings, ScriptContext.GLOBAL_SCOPE);
        scriptContext.setBindings(bindings, ScriptContext.ENGINE_SCOPE);
        scriptEngine.setContext(scriptContext);
        return scriptEngine;
    }
     
    function runScript(language:String, script:String, editorNode:EditorNode):Object {
            // Lazily initialize the scripting engine.
        def scriptEngine = initScriptEngine(language, editorNode);
        if (script.trim().isEmpty()) {
            return null;
        }
        println("Will eval:\n{script}");
        def returnValue = scriptEngine.eval(script);
        println("Returned value: {returnValue}");
        return returnValue;
    }
    Et l'editeur :
    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
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
     
    /*
     * EditorNode.fx
     *
     * Created on Mar 2, 2009, 1:32:59 PM
     */
     
    package interpreter;
     
    import java.awt.BorderLayout;
    import javafx.ext.swing.SwingComponent;
    import javafx.scene.CustomNode;
    import javafx.scene.Group;
    import javafx.scene.Node;
    import javax.swing.event.DocumentEvent;
    import javax.swing.event.DocumentListener;
    import javax.swing.JComponent;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JSplitPane;
    import javax.swing.JTabbedPane;
    import javax.swing.JTextArea;
     
    /**
     * @author fabriceb
     */
     
    public class EditorNode extends CustomNode, DocumentListener {
        public var scriptArea: JTextArea;
        public var errorArea: JTextArea;
        public var outputArea: JTextArea;
     
        var bottomTab: JTabbedPane;
        var content: JComponent;
        var delegated: SwingComponent;
     
        public var width: Number = 320 on replace {
            delegated.width = width;
        }
        public var height: Number = 200 on replace {
            delegated.height = height;
        }
        public override function create(): Node {
            scriptArea = new JTextArea();
            scriptArea.setWrapStyleWord(false);
            scriptArea.setFont(new java.awt.Font("Courier New", java.awt.Font.PLAIN, 12));
            var scriptScroll = new JScrollPane(scriptArea);
            errorArea = new JTextArea();
            errorArea.getDocument().addDocumentListener(this);
            errorArea.setEditable(false);
            errorArea.setWrapStyleWord(false);
            errorArea.setFont(new java.awt.Font("Courier New", java.awt.Font.PLAIN, 12));
            var errorScroll = new JScrollPane(errorArea);
            outputArea = new JTextArea();
            outputArea.getDocument().addDocumentListener(this);
            outputArea.setEditable(false);
            outputArea.setWrapStyleWord(false);
            outputArea.setFont(new java.awt.Font("Courier New", java.awt.Font.PLAIN, 12));
            var outputScroll = new JScrollPane(outputArea);
            bottomTab = new JTabbedPane();
            bottomTab.addTab("Ouput", outputScroll);
            bottomTab.addTab("Error", errorScroll);
            //bottomTab.setSelectedIndex(1);
            var bottomPanel = new JPanel();
            bottomPanel.setOpaque(false);
            bottomPanel.setLayout(new BorderLayout());
            bottomPanel.add(bottomTab, BorderLayout.CENTER);
            var splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, scriptScroll, bottomPanel);
            splitPane.setDividerLocation(300);
            var editor = new JPanel();
            editor.setOpaque(false);
            editor.setLayout(new BorderLayout());
            editor.add(splitPane, BorderLayout.CENTER);
            content = editor;
            delegated = SwingComponent.wrap(content);
            return Group {
                content: [delegated]
            };
        }
     
        var eventAdjusting = false;
     
        public function clearMessages() {
            eventAdjusting = true;
            try {
                errorArea.setText(null);
                outputArea.setText(null);
            }
            finally {
                eventAdjusting = false;
            }
        }
     
        override public function insertUpdate(e:DocumentEvent):Void {
            if (eventAdjusting) {
                return;
            }
            //println("insertUpdate");
            var document = e.getDocument();
            if (document == errorArea.getDocument()) {
                bottomTab.setSelectedIndex(1);
            }
            else if (document == outputArea.getDocument()) {
                bottomTab.setSelectedIndex(0);
            }
        }
     
     
        override public function removeUpdate(e:DocumentEvent):Void {
            if (eventAdjusting) {
                return;
            }
            //println("removeUpdate");
        }
     
     
        override public function changedUpdate(e:DocumentEvent):Void {
            if (eventAdjusting) {
                return;
            }
            //println("changedUpdate");
        }
    }
    Sachant que je peux lancer ce script interprete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    import interpreter.*;
     
    def tj = new TestJ();
    tj.doStuff("salut");
    def tfx = TestFX {
    }
    tfx.doStuff("salut");
    Sachant qu'on peut initialise au vol des classes du projet et qu'en plus je peux passer des variables via le binding, il doit quand meme etre possible de faire ce que tu cherches.
    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
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 897
    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 897
    Billets dans le blog
    54
    Par défaut
    PS : jai reposte le code audessus, au debut je n'avais pas mis la bonne classe.

    Mais ou s'insere le moteur de scripting dans tout ca ?
    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

  11. #11
    Membre Expert
    Avatar de X-plode
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2005
    Messages
    682
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2005
    Messages : 682
    Par défaut
    J'ai vu dans une doc de big blue qu'on pouvait utiliser le moteur de scripting pour faire appel à une méthode d'une classe Fx.

    A l'heure actuelle, je n'y suis pas arriver.

    Alors je suis en quête d'une solution annexe ou correspondante.

  12. #12
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 897
    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 897
    Billets dans le blog
    54
    Par défaut
    Alors, il ne faut pas non-plus oublier que le script interprete retourne une valeur qui est un objet qui correspont a la derniere ligne du script. Ainsi on peut faire dans Main.fx :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                    def value = runScript(language, text, editorNode);
                    if (value instanceof JTextArea) {
                        def area = value as JTextArea;
                        area.setText("{area.getText()}\nWe are back in the pre-compiled code.");
                    }
    Avec le script suivant :
    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
     
    import javafx.stage.*;
    import javafx.scene.*;
    import javafx.ext.swing.*;
    import java.awt.*;
    import javax.swing.*;
     
    // GUI.
    def area = new JTextArea();
    def scroll = new JScrollPane(area);
    scroll.setPreferredSize(new Dimension(600, 400));
    def scrollNode = SwingComponent.wrap(scroll);
    var scene:Scene;
    def stage = Stage {
     title: "Test";
     override var width on replace {
       scrollNode.width = scene.width;
     }
     override var height on replace {
       scrollNode.height = scene.height;
     };
     scene: scene = Scene {
       content: scrollNode;
     }
    }
    area;
    Donc on peut recuperer un objet initilise par le scripting engine dans le coeur pre-compile de l'application.
    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

  13. #13
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 897
    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 897
    Billets dans le blog
    54
    Par défaut
    Ensuite il est tout a fait possible de creer des listeners dynamiquement en utilisant les closures :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        bindings.put("timer", new ActionTimerFX());
    Note : j'utilise une classe Java ici car la classe javax.swing.Timer ne dispose pas de constructeur par defaut et apparement c'est un peu prise de tete en JavaFX d'heriter d'une classe Java sans constructeur par defaut.
    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 interpreter;
     
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.Timer;
     
    /**
     *
     * @author fabriceb
     */
    public class ActionTimerJ extends Timer implements ActionListener {
     
        /**
         * Creates a new instance.
         */
        public ActionTimerJ() {
            super(1000, null);
            setInitialDelay(0);
            addActionListener(this);
        }
     
        /**
         * {@inheritDoc}
         */
        @Override
        public void actionPerformed(ActionEvent e) {
        }
    }
    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
     
    /*
     * ActionTimerFX.fx
     *
     * Created on Apr 27, 2009, 8:53:20 AM
     */
     
    package interpreter;
     
    import interpreter.ActionTimerJ;
    import java.awt.event.ActionEvent;
     
    /**
     * @author fabriceb
     */
     
    public class ActionTimerFX extends ActionTimerJ {
        public var action:function():Void;
     
        /**
         * {@inheritDoc}
         */
        public override function actionPerformed(e:ActionEvent):Void {
            // Call the closure.
            action();
        }
    }
    Et le scipt :
    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
     
    import javafx.stage.*;
    import javafx.scene.*;
    import javafx.ext.swing.*;
    import java.awt.*;
    import javax.swing.*;
     
    // GUI.
    def area = new JTextArea();
    // Redefine the closure.
    timer.action = function():Void {
      area.setText("{area.getText()}.");
    }
    area.setText(now.toString());
    area.getDocument().addDocumentListener(testfx);
    area.getDocument().addDocumentListener(testj);
    def scroll = new JScrollPane(area);
    scroll.setPreferredSize(new Dimension(600, 400));
    def scrollNode = SwingComponent.wrap(scroll);
    var scene:Scene;
    def stage = Stage {
     title: "Test";
     override var width on replace {
       scrollNode.width = scene.width;
     }
     override var height on replace {
       scrollNode.height = scene.height;
     };
     scene: scene = Scene {
       content: scrollNode;
     }
    }
    timer.start();
    area;
    Je pense avoir traite tous les cas de figure la, je ne vois pas trop ce que je peux faire d'autre.
    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

  14. #14
    Membre Expert
    Avatar de X-plode
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2005
    Messages
    682
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2005
    Messages : 682
    Par défaut
    Salut Bouye,

    Je tiens à te remercier énormément.

    Je pense que je vais utiliser le design pattern observer.

    Tout autant, ce matin ( à 4h du matin ), j'ai trouvé une réponse.
    Il est possible d'accéder à une classe Fx depuis une classe Java.

    Ma classe Fx :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    import java.lang.System;
     
    class MyClass{
        public function test(): Void{
           System.out.println("[my class] test()");
        }
     
    }

    Depuis ma classe java :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class Main {    
        public static void main(String[] args) {
     
    	MyClass myClass = new MyClass();
            myClass.test();
     
        }
     
    }
    Si on passe par le terminale ( je suis sous OsX ), sa run. Donc javafxc puis javac et enfin on fait javafx.
    Mais pas depuis Netbeans, c'est impossible car c'est un bug.

    Etant donné, la différence je pense que je vais m'orienter sur l'observable/observer.

  15. #15
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 897
    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 897
    Billets dans le blog
    54
    Par défaut
    Gaffe quand meme ca risque de ne pas fonctionner avec des classes ayant des membres public-init je pense. Sinon une autre solution peut etre la reflection.
    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

  16. #16
    Membre Expert
    Avatar de X-plode
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2005
    Messages
    682
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2005
    Messages : 682
    Par défaut
    Sinon une autre solution peut être la reflection.
    C'est aussi, une autre solution sur laquelle je pourrais m'orienter.
    Je tente mes méthodes aujourd'hui ou demain.
    Je tenterais les différentes méthodes avec ( si je peux ) des tests de performance si je peux le faire et je te dirais ce qui aura fonctionné.

    En tout cas, merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Simuler les classes utilisées dans une méthode
    Par Danthen dans le forum C#
    Réponses: 4
    Dernier message: 22/01/2013, 08h11
  2. Réponses: 4
    Dernier message: 08/01/2010, 13h59
  3. Réponses: 3
    Dernier message: 20/04/2009, 09h13
  4. Réponses: 4
    Dernier message: 04/07/2008, 10h34
  5. Réponses: 3
    Dernier message: 05/10/2006, 18h52

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