2014-09-25 5 views
1

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

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

Это похоже на Java SWT browser: Waiting till dynamic page is fully loaded, но решения нет.

+0

Какая часть предлагаемого решения не работает? – Baz

+0

Сразу после выполнения функции browser.setText() цикл while выполняется и по завершении = true, он даже не входит в цикл. Например, если я помещаю оператор печати во время цикла while, он не печатается даже один раз. См. редактируемый код. – user3873909

+0

Ну, установив короткий текст, как это делается в одно мгновение. Почему вам все равно нужен цикл? – Baz

ответ

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; 
} 
Смежные вопросы