2016-09-29 23 views
0

有人可以请向我解释我在做什么错了下面的代码?如何让JavaFx中的WebView等待任意时间而不挂上应用程序?

我正在使用executeJavascript方法向Webview发送一系列命令,我想遍历每个命令,然后在执行下一个命令之前等待任意长度的时间。

当我运行这个程序时,实际发生的事情是应用程序每次都会在循环中暂停,然后一旦循环完成,我的所有javascript操作都会立即发生。我想通过将我的executeJavascript包装到Runlater类中,它将全部与应用程序线程很好地同步...

我似乎要围绕着这样的帮助/方向,将不胜感激,谢谢。

我已经设置了三个类,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

尽可能扩大在线程

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(); 
      } 
     } 
} 

您ScriptRunner类,然后调用

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

我认为这个问题是Thread.sleep(3000);导致应用程序挂起。该进程应该在Thread上运行。

+0

'Thread.run',好笑话(我猜?)。 – fabian

+0

谢谢,但即使通过线程扩展我的ScriptRunner类并使用从它继承的睡眠之后,我在页面上执行的Javascript命令仍然成批处理。我认为你是对的,它是导致应用程序挂起的线程,只是不知道如何解决它。 –