Как дождаться окончания загрузки браузера SWT?

1

Я использую браузер SWT в своем приложении. Мне нужно запустить скрипт на странице HTML в браузере. Но сценарий запускается до полной загрузки страницы. Итак, как мне сделать приложение ждать, пока браузер завершит загрузку. Я пробовал что-то вроде этого.

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
}

Но это не сработает!

Это похоже на браузер Java SWT: ожидание до полной загрузки динамической страницы, но решения нет.

  • 0
    Какая часть предложенного решения не работает?
  • 0
    Сразу после того, как browser.setText () выполнен, цикл while выполняется, и к тому времени complete = true он даже не входит в цикл. Как и в случае, когда я помещаю инструкцию print в цикл while, он не печатается ни разу Пожалуйста, смотрите отредактированный код.
Показать ещё 3 комментария
Теги:
browser
swt

2 ответа

1

Вы можете определить функцию BrowserFunction и вызвать ее из кода 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;
    }
}
0

Баз дает правильное решение. Я попытаюсь ответить на ваш вопрос в вашем контексте:

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню