当前位置: 首页 > 知识库问答 >
问题:

JavaFX/SWT WebView同步加载内容()

史磊
2023-03-14

我已经在Eclipse SWT应用程序中嵌入了JavaFX的WebView,需要加载html内容。我需要阻止当前线程的执行,直到webengine加载完内容。任何熟悉这种情况并能给出一些提示和/或最佳实践来实现这一点的人?SWT和JavaFX似乎都在同一个UI线程中运行。

谢谢

共有3个答案

宗建章
2023-03-14

我也遇到了同样的问题,我需要以同步方式从某个页面加载HTML,因此我想出了以下解决方案:

import org.w3c.dom.Document;

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.Scene;
import javafx.scene.web.WebView;
import javafx.stage.Stage;

public class SynchronousExample  extends Application {

private static String HTML = "";
private static Stage stage;

@Override
public void start(Stage primaryStage) throws Exception {
    System.out.print( SynchronousExample.loadUrl("http://google.com") );

}

public static void main(String[] args){
    launch(args);
}

private static void attachDocumentPropertyListener(WebView webView){
    webView.getEngine().documentProperty().addListener(new ChangeListener<Document>() {
          @Override public void changed(ObservableValue<? extends Document> prop, Document oldDoc, Document newDoc) {
            String html = webView.getEngine().executeScript(
              "document.documentElement.outerHTML"
            ).toString();

            HTML = html;
            //after page load autmatically close the window
            if(stage != null){
                stage.close();
            }
          }
        });
}

public static String loadUrl(String url){
    WebView webView = new WebView();
    attachDocumentPropertyListener(webView);
    webView.getEngine().load(url);
    stage = new Stage();
    Scene scene = new Scene(webView);
    stage.setWidth(1);
    stage.setHeight(1);
    stage.setScene(scene);
    stage.showAndWait();
    // here HTML will be available
    return HTML;
}

}
齐宗清
2023-03-14

JavaFX webengine在每个实现中异步加载。loadworker的stateproperty的任何侦听器都会在JavaFX线程上接收回调。该线程还运行您的UI,这就是为什么您永远不应该阻止JavaFX线程。在JavaFX等基于事件的UI系统中,如果您想做一些繁重的工作,可以在自己的线程中完成。永远不要阻止JavaFX线程。

我回答这个问题的原因是,我实际上有一个类似但不同的情况,我确实需要同步负载。我的第一个想法是在我自己的线程中包装加载并生成该块,但加载操作需要从JavaFX线程调用。然而,我想出了一个绕过这个障碍的办法:

首先,我启动一个新线程,在其中声明一个信号量(具有0个许可证),从中启动一个平台。runLater(…)它启动一个引擎,向stateproperty添加一个侦听器,并加载一个URL,然后尝试获取信号量。这会阻塞,因为信号量没有许可证。在监听器的回调中,我启动了另一个新线程,在其中我完成了繁重的工作,并从那里设置了一些全局数据变量,然后释放信号量。这将终止后一个新线程,然后通知前一个新线程数据已加载,以便继续。这也不会阻止JavaFX线程。

当在函数中包装它时,您可以模拟同步加载操作,但是在使用它时应该小心:只从JavaFX线程之外调用函数。然而,这是完全合理的,因为您不应该在JavaFX线程上调用同步(也称为阻塞)负载。

彭高畅
2023-03-14

加载未完成时显示模式窗口。不能阻止应用程序线程,因为SWT/JavaFX在同一个线程上运行

 类似资料:
  • 我正在构建我的第一个VueJs应用程序,我想异步加载我的模板。在我们的框架中,我们将模板存储在数据库中,这就是为什么。它一直在工作,直到我的模板中有一些嵌套的dom元素,而没有任何数据绑定到它为止。所以我的Vuejs就像: 这是工作时,我的模板是这样的: 但如果是这样的话: 我明白了 [Vue warn]:呈现中出错:“TypeError:无法读取未定义的”(在中找到)的属性“0” 但如果是这样的

  • 本文向大家介绍JS同步、异步、延迟加载的方法,包括了JS同步、异步、延迟加载的方法的使用技巧和注意事项,需要的朋友参考一下 本文讲述了JS同步、异步、延迟加载的方法。分享给大家供大家参考,具体如下: 一:同步加载 我们平时使用的最多的一种方式。 <script src="http://yourdomain.com/script.js"></script> 同步模式,又称阻塞模式,会阻止浏览器的后续

  • 我有一个问题,加载图像到我的应用程序。我正在尝试做一个简单的图像浏览器。在左边我有一个文件夹列表。单击列表上的文件夹名称后,图像应该出现在右侧(流窗格)。每个图像都在带有边框的HBox中。但我很快就会犯这样的错误: 我看任务管理器-如果我只加载6张照片,应用程序占用500MB的内存!还有一件事--如果我更改列表上的文件夹,内存就会被占用。在选择另一个文件夹时,我正在创建新的flowPane 所以包

  • 9.4. 内存同步 你可能比较纠结为什么Balance方法需要用到互斥条件,无论是基于channel还是基于互斥量。毕竟和存款不一样,它只由一个简单的操作组成,所以不会碰到其它goroutine在其执行"期间"执行其它的逻辑的风险。这里使用mutex有两方面考虑。第一Balance不会在其它操作比如Withdraw“中间”执行。第二(更重要)的是"同步"不仅仅是一堆goroutine执行顺序的问题

  • 更新 我试过很多解决办法,但都没有达到我的目标。应用程序加载UsersMainPageController,它只包含一个AnchorPane(类似于父控件),因此这是相关代码: [UsersMainPageController]

  • 这可能不是一个可以接受的问题,但我现在非常绝望。 我需要一个同步java媒体播放器与快速寻找和平衡修改。 脚本: 我有一个javaFX项目,我必须在循环中播放一个非常短(50-100毫秒)的媒体文件。问题是,在重新启动之前,我需要等待一些要求。 简而言之:播放声音- javafx提供了一个我修改过的媒体播放器。 如果有人能为我指出正确的方向(图书馆/我错过的东西),我将不胜感激 ps允许的java