Может кто-нибудь, пожалуйста, объясните мне, что я делаю неправильно с приведенным ниже кодом?Как я могу заставить 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;
}
}
'Thread.run', хорошая шутка (я думаю?). – fabian
Спасибо, но даже после расширения класса ScriptRunner потоком и использования унаследованного от него сна, мои команды Javascript, выполненные на странице, все еще загружены. Я думаю, что вы правы, и его Thread, который вызывает приложение, зависает, просто не уверен, как я могу обойти его. –