Comment puis-je exécuter du code de script personnalisé à partir du niveau de l'application Java?


Considérez ceci: j'ai une application dans laquelle je veux fournir aux utilisateurs la possibilité d'écrire des scripts simples, afin qu'ils puissent piloter l'application de manière plus individuelle. Ces scripts seront basés sur la bibliothèque personnalisée Java et seront écrits dans par exemple JavaFX TextArea control item.

Maintenant, disons, un utilisateur a écrit quelque chose comme ça: entrez la description de l'image ici

Lorsqu'il clique sur le bouton "Exécuter le script", le script sera exécuté en fonction du contenu de la bibliothèque personnalisée. Mais la question est de: Comment puis-je exécuter ce type de "pseudo code Java" dans l'application Java et forcer l'application à se comporter en fonction du script de l'utilisateur?

PS il peut y avoir aussi d'autres possibilités pour la forme de ce "script-language". Il n'est pas nécessaire qu'il s'agisse d'un langage "basé sur une bibliothèque java".

Author: bluevoxel, 2014-10-25

3 answers

Il y a le javax.script pour cela. Nous pouvons implémenter l'interface ScriptEngine et utiliser sa fonction eval ou utiliser le moteur js déjà implémenté, par exemple:

ScriptEngineManager seManager = new ScriptEngineManager();
ScriptEngine engine = seManager.getEngineByName("js");
button.setOnMousePressed(new EventHandler() {
    @Override
    public void handle(MouseEvent mouseEvent) {     
        try {
            engine.eval(textArea.getText());
        } catch (ScriptException e) {
            e.printStackTrace();
        }
    }
});
 0
Author: Alexander.Berg, 2014-10-25 17:09:09

Jetez un oeil au projet FX Playground, un outil de prototypage basé sur JavaFX ou un éditeur en direct de Carl Dea:

Ce projet permet à un développeur JavaFX ou Html5 d'exécuter du code à la volée sans avoir besoin de compiler un projet Java.

Vous pouvez exécuter du code HTML5, accéder aux API graphiques JavaFX, charger des bibliothèques tierces et prendre en charge les langages JavaScript (Nashorn, Webkit), Groovy, GroovyFX, Jython, JRuby, Scala, Clojure, Coffe4Java.

 0
Author: José Pereda, 2014-10-25 18:53:00

Complément d'Alexandre.La réponse de Berg, vous pouvez y parvenir en utilisant Javascript grâce au moteur Nashorn. Voici un exemple rapide:

MyFXMLController.java:

public class MyFXMLController implements Initializable {

    @FXML
    private Label labelName;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        labelName.setText("Fernando Paz");
        playAnimationScript();
    }

    private void playAnimationScript() {
        try {
            ScriptEngine engine = new ScriptEngineManager().getEngineByName("javascript");
            File scriptFile = new File("src/application/label-animation.js");
            engine.put("labelName", labelName);
            engine.eval(new FileReader(scriptFile));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Étiquette animation.js:

load("fx:base.js");
load("fx:controls.js");
load("fx:graphics.js");

playAnimation();

function playAnimation() {
    labelName.opacity = 0.0;
    animation = new Timeline();
    animation.getKeyFrames().addAll(new KeyFrame(new Duration(600), new KeyValue(labelName.opacityProperty(), 1.0)));
    animation.autoReverse = true;
    animation.cycleCount = Animation.INDEFINITE;
    animation.play();
}

De plus amples informations sur l'exécution de scripts dans JavaFX peuvent être trouvées ici:

 0
Author: Fernando Paz, 2014-10-26 12:00:02