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

如何等到SWT浏览器完成加载?

尚河
2023-03-14

我在我的应用程序中使用SWT浏览器。我需要在浏览器中的超文本标记语言页面上运行脚本。但是脚本是在页面完全加载之前运行的。所以我如何让应用程序等待,直到浏览器完成加载。我曾经尝试过这样的事情。

completed = true;
browser.addProgressListener(new ProgressListener() {
    @Override
    public void completed(ProgressEvent event) {
        completed = true; //say this is a global variable 
    }

    @Override
    public void changed(ProgressEvent event) {
        completed = false;
        System.out.println("Page changing");

    }
});

//some other method
void m1() 
{
    browser.setText("blah blah blah");
    while (completed == false) 
    {}
    // EXECUTE THE SCRIPT NOW
}

但是这样不行!

这类似于JavaSWT浏览器:等待动态页面完全加载,但没有解决方案。

共有2个答案

狄飞尘
2023-03-14

Baz给出了正确答案的方向。我将试着把他的答案放在你的上下文中:

private boolean loading;    // Instance variable

createBrowserControl() {    // Browser widget definition method
    Browser b = ...;    // Create the browser widget
    browser.addProgressListener(new ProgressListener() {

        @Override
        public void completed(ProgressEvent event) {
            loading = false;
        }

        @Override
        public void changed(ProgressEvent event) {
            loading = true;
        }
    });
}

public boolean loadPage(String url) {
    Display display = ...   // Get the display from the UI or the widget
    boolean set = browser.setUrl(url);    // URL content loading is asynchronous
    loading = true;
    while(loading) {    // Add synchronous behavior: wait till it finishes loading
        if(!display.readAndDispatch()) {
            display.sleep();
        }
    }
    return set;
}
韩淇
2023-03-14

您可以定义一个浏览器函数,并从JavaScript代码中调用它:

public static void main(String[] args)
{
    Display display = new Display();
    Shell shell = new Shell(display);
    shell.setLayout(new FillLayout());

    Browser browser = new Browser(shell, SWT.NONE);

    new CustomFunction(browser, "theJavaFunction");

    browser.setText("<style>#map { width: 100%; height: 300px; }</style><script src='http://maps.google.com/maps/api/js?sensor=false'></script><div id='map'></div><script>var map;function initialize() {  var mapOptions = { zoom: 8, center: new google.maps.LatLng(-34.397, 150.644) }; map = new google.maps.Map(document.getElementById('map'), mapOptions);} google.maps.event.addDomListener(window, 'load', initialize);window.onload = function () { theJavaFunction(); };</script>");
    shell.pack();
    shell.setSize(600, 400);
    shell.open();

    while (!shell.isDisposed())
    {
        if (!display.readAndDispatch())
            display.sleep();
    }
    display.dispose();
}

private static class CustomFunction extends BrowserFunction
{
    CustomFunction(Browser browser, String name)
    {
        super(browser, name);
    }

    @Override
    public Object function(Object[] arguments)
    {
        System.out.println("theJavaFunction() called from javascript");
        return null;
    }
}
 类似资料:
  • 问题内容: 在我的Arch Linux,带有Google Window Builder / SWT应用程序的Eclipse上, 我相信我需要安装XULrunner或其他东西。但是当我在Arch中安装时,我得到了。所以我尝试安装。然后,我添加到并且不确定使用哪个。但是当我跑步时,我仍然遇到相同的错误。似乎仍未使用webkit。我怎样才能解决这个问题? 更新2 到目前为止,我尝试安装。然后添加到中,我

  • 我正在使用swt。浏览器包,允许用户在我的应用程序中使用Facebook登录。但是,当用户登录时,会话/cookie存储在磁盘上。我的目标是删除所有会话/cookie。通过浏览器清除会话。clearSessions()没有帮助,因为Facebook身份验证密钥(或类似密钥)很可能存储为cookie。 在网上和(瘦)文档中搜索了几个小时,我找不到一种方法来清除实例的cookies。 <代码>浏览器。

  • 问题内容: 我们一直在寻找答案,但是还没有找到解决方案。 我们有一个Web服务器,允许用户下载动态生成的文件(pdf),并通过servlet提供服务。我们想知道下载何时完成(以及如何:成功,失败,用户取消了吗?)。 没有用户输入,有没有办法知道这一点?这些文件相对较小,因此不需要进度条功能,但是我们需要某种“挂勾”功能,可以在下载完成后向您报告。这可能吗? [edit]浏览器端将具有什么功能来检测

  • 问题内容: 我在使用SWT浏览器组件时遇到了一些麻烦。我正在运行带有Sun的Java SE 1.6的Ubuntu 11.04 AMD64和Eclipse 3.7 我的问题是我的浏览器无法初始化。当我使用SWT.NONE标志实现时,出现错误 然后当我尝试使用SWT.MOZILLA标志时,我得到 我怀疑这部分是因为我正在使用XULRunner2,但是我更喜欢使用WebKit,在Eclipse 3.7中

  • 问题内容: 我写了一个简单的程序。只是CTabItem固有的CTabFolder和WelcomTab。我想通过呈现我的html的浏览器填充我的WelcomeTab。在WelcomeTab的init()方法上,我创建了一个浏览器,但是当程序要构造它时,出现此错误 … 另外,我在基于Arch-Linux的KDE上使用Eclipse 3.7,因为我在各处搜索到此错误时都发现线程受限,所以这是一个简单的程

  • 问题内容: 我如何在客户端使用 HTML5 , CSS 和 JavaScript 编写网站,以便 在页面加载后 允许 客户端浏览器之间的直接tcp / ip连接 。 我需要这样做以减少延迟,因为该站点将要求将其中一个用户的输入尽快传输给另一用户,因此从客户端A到服务器再向客户端B发送数据并不是一个好习惯。选项。 我阅读了有关此主题的先前文章,但没有可用的解决方案/示例。据我了解,可以使用Silve