2017-05-19 4 views
4

J'utilise cet extrait pour créer écouteur js dans mon navigateur JavaFX:Comment créer un écouteur javascript WebBrowser JavaFX sans nom membre

 engine.getLoadWorker().stateProperty().addListener(
       (observable, oldValue, newValue) -> { 
        if (newValue == Worker.State.SUCCEEDED) { 
         System.out.println("changed event detected"); 
         JSObject win = (JSObject) engine.executeScript("window"); 
         win.setMember("java", new JavascriptListener()); 
        } 
       } 
     ); 

Mais je voudrais pouvoir appeler mes fonctions sans préfixer les avec "java".

Est-ce possible?

Répondre

2

D'une manière générale, non.

Il n'y a pas de fonctions java/javascript (fonctionnelles) pour ce faire à l'échelle native. J'ai essayé la fonction Object.assign javascript, mais cela ne fonctionnait pas pour les variables ou les méthodes. D'autres choses semblables ne fonctionnent pas correctement sur les objets Java soit

Si vous êtes prêt à vous exposer aux horreurs de la réflexion Java, cependant, être mon invité:

public class JavaVariableAssigner { 

                   //javascript-stored objects do not appear to the 
    private static ArrayList<Object> gcLock = new ArrayList(); //garbadge collector so we need to make sure 
                   //they don't get deleted by always keeping 
                   //a reference to them from this list 


    public static void addAllMembers(WebEngine browser, Object obj) { 
     gcLock.add(obj); 

     ((JSObject) browser.executeScript("window")).setMember("java", obj); 

     for(Method m : obj.getClass().getDeclaredMethods()) { 
      ArrayList<String> parameterNames = new ArrayList(); 
      for(Parameter p : m.getParameters()) parameterNames.add(p.getName()); 
      String params = String.join(",", parameterNames.toArray(new String[0])); 
      browser.executeScript("function "+m.getName()+"("+params+"){ return java."+m.getName()+"("+params+"); };"); 
     } 

     for(Field f : obj.getClass().getDeclaredFields()) { 
      browser.executeScript("var "+f.getName()+" = java."+f.getName()+";"); 
     } 
    } 

} 

Tout votre code en utilisant le ' Le préfixe java continuera à fonctionner, mais toutes les méthodes peuvent maintenant (aussi, espérons-le) être accessibles directement en tapant son nom. Comme je l'ai (en quelque sorte) dit, cependant, cette méthode repose entièrement sur l'assemblage de javascript et l'évaluation de sorte que je ne le recommanderais pas.

+0

Ok, j'ai attribué la prime. C'est en fait la solution que j'ai trouvée juste après le début de la prime, mais la vôtre est beaucoup plus élégante puisqu'elle les ajoute automatiquement tous. – Myoch