2016-09-29 10 views
0

Может кто-нибудь, пожалуйста, объясните мне, что я делаю неправильно с приведенным ниже кодом?Как я могу заставить WebView в JavaFx подождать какое-то время, не повесив приложение?

Я использую метод executeJavascript для отправки серии команд в Webview, я хочу прокручивать каждую команду, а затем ждать произвольного количества времени до выполнения следующей команды.

Что на самом деле происходит, когда я запускаю это, так это то, что приложение будет зависать каждый раз, когда я останавливаюсь в цикле, а после завершения цикла все мои действия javascript происходят сразу. Я думал, завернув мой executeJavascript в класс Runlater, что все это будет хорошо синхронизироваться с приложением Application ...

Я, кажется, обворачиваю круги, так что помощь/направление будут оценены, спасибо.

Я создал три класса, A: Main.class, который содержит следующее:

...scene.setOnKeyPressed(event -> { 
     switch (event.getCode()) { 
      case SPACE: 
       scriptRunner.run(); 
      case SHIFT: 

B: ScriptRunner.class, который содержит следующее:

public class ScriptRunner extends Task<Void> { 

@Override 
protected Void call() throws Exception { 

    printOut("Running Test"); 
    try (InputStream fileInputStream = new FileInputStream("test.txt"); 
     InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, Charset.forName("UTF-8")); 
     BufferedReader bufferedReader = new BufferedReader(inputStreamReader);) { 
     String getCurrentLine; 
     StepRunner stepRunner = new StepRunner(); 

     while ((getCurrentLine = bufferedReader.readLine()) != null) { 
      final String currentLine = getCurrentLine; 
      Platform.runLater(new Runnable() { 
       @Override 
       public void run() { 
        stepRunner.runStep(currentLine); 
       } 
      }); 
      Thread.sleep(3000); 
     } 

     printOut("Test finished"); 
     bufferedReader.close(); 
    } catch (
      IOException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

C: StepRunner.class который содержит следующее:

public class StepRunner extends Task<Void> { 
private String currentCommand; 

public StepRunner (String currentCommand){ 
    this.currentCommand = currentCommand; 
} 

@Override 
protected Void call() throws Exception { 
    printOut("Got Here with " + currentCommand); 
    WebEngine.executeJavascript(currentCommand); 
    return null; 
} 

}

ответ

0

Попробуйте расширить класс ScriptRunner в тему

public class ScriptRunner extends Thread { 

     @Override 
     public void run() { 
      printOut("Running Test"); 
      try (InputStream fileInputStream = new FileInputStream("test.txt"); 
       InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, Charset.forName("UTF-8")); 
       BufferedReader bufferedReader = new BufferedReader(inputStreamReader);) { 
       String getCurrentLine; 
       StepRunner stepRunner = new StepRunner(); 

       while ((getCurrentLine = bufferedReader.readLine()) != null) { 
        final String currentLine = getCurrentLine; 
        Platform.runLater(new Runnable() { 
         @Override 
         public void run() { 
          stepRunner.runStep(currentLine); 
         } 
        }); 
        Thread.sleep(3000); 
       } 

       printOut("Test finished"); 
       bufferedReader.close(); 
      } catch (
        IOException e) { 
       e.printStackTrace(); 
      } 
     } 
} 

затем вызвать

Thread scriptRunner = new Thread(new ScriptRunner()); 
scriptRunner.run(); 

Я думаю, что проблема Thread.sleep(3000); что вызывает приложение, чтобы повесить. Процесс должен выполняться в потоке.

+0

'Thread.run', хорошая шутка (я думаю?). – fabian

+0

Спасибо, но даже после расширения класса ScriptRunner потоком и использования унаследованного от него сна, мои команды Javascript, выполненные на странице, все еще загружены. Я думаю, что вы правы, и его Thread, который вызывает приложение, зависает, просто не уверен, как я могу обойти его. –