2017-03-09 1 views
1

J'ai une boucle d'établissement en utilisant un ScheduledExecutorService qui s'exécute toutes les 1 seconde. J'ai un WebView (JavaFX) que je veux appeler une fonction de celui-ci.L'exécution de la fonction javascript dans ScheduledExecutorService?

Je peux appeler des fonctions bien si je le mets en fait un bouton comme:

button.setOnAction(event -> { 
    webEngine.executeScript("someFunction();"); 
}); 

et cliquez dessus et il exécute très bien, mais quand je fais:

execService.scheduleAtFixedRate(()->{ 
    loop(); 
    webEngine.executeScript("someFunction();"); 
}, 3000L, 1000L, TimeUnit.MILLISECONDS); 

le programme juste s'arrête à webEngine.executeScript("someFunction();"); (fait la même chose si je mets cette ligne dans ma méthode loop())

Comment puis-je exécuter someFunction() chaque seconde à côté du reste de mon programme? Pourquoi est-ce qu'il fait une pause?

+1

Que voulez-vous dire par "arrête juste"? Gèle/se bloque? Crashes? Si oui, que dit la trace de la pile? – Mena

+0

@Mena Je peux toujours cliquer sur des choses et faire des choses, rien ne s'affiche dans la console, tout fonctionne bien sauf que tout ce qui devrait être exécuté dans scheduleexecutorservice ne fonctionne pas, par exemple. si je mets un 'System.out.println (" bleh ")' après le 'webEngine.executeScript (" someFunction(); ")' il ne l'atteint pas – srysry

Répondre

1

s'il vous plaît essayez ceci:

timer = new Timer(); 
     timer.scheduleAtFixedRate(new WebViewProcess(), 3000, 1000); 

private class WebViewProcess extends TimerTask { 

     @Override 
     public void run() { 
      Platform.runLater(() -> { 
        webEngine.executeScript("someFunction();"); 
      }); 
     } 
    } 
+1

merci beaucoup cela a fonctionné! – srysry

+0

content de vous aider –

+1

Notez que 'Timer' est obsolète et' ScheduledExecutorService' est le remplacement recommandé. La résolution ici est probablement sur l'invocation asynchrone 'Platform.runLater'. – Mena