2011-04-15 55 views
3

我想更改SWT浏览器(用户定义的某个网页)的内容,然后才会显示给用户。 当我说变化,我的意思是添加几个CSS/JS文件到HTML代码。我试着使用ProgressListener来达到这个目的(我用getText()得到所有的代码,做了一些修改并且使用setText()方法),但是发现在这种情况下,没有绝对路径定义的所有其他资源是没有更多的可用。SWT浏览器,在显示之前更改内容

发生这种情况,是因为setText()浏览器将页面设置为about:blank之后。所以,我拥有所有的代码,但用相对路径定义的所有css/js/img都不可用。

是否可以添加几行css/js定义,而不是放松没有相对路径定义的所有资源?

在此先感谢!

回答

5

使用getText并修改它不是更改HTML内容的可取方法。我会建议你使用​​方法org.eclipse.swt.browser.Browser。它允许你在页面的DOM对象上激发javascripts。

>>例

在这里,在这个代码,我让网页完全加载,然后寻找所有的链接项目,然后创建它们周围red border

>>输出 enter image description here

>>代码

import org.eclipse.swt.SWT; 
import org.eclipse.swt.SWTError; 
import org.eclipse.swt.browser.Browser; 
import org.eclipse.swt.browser.LocationEvent; 
import org.eclipse.swt.browser.LocationListener; 
import org.eclipse.swt.browser.ProgressEvent; 
import org.eclipse.swt.browser.ProgressListener; 
import org.eclipse.swt.layout.GridData; 
import org.eclipse.swt.layout.GridLayout; 
import org.eclipse.swt.widgets.Display; 
import org.eclipse.swt.widgets.Event; 
import org.eclipse.swt.widgets.Label; 
import org.eclipse.swt.widgets.Listener; 
import org.eclipse.swt.widgets.Shell; 
import org.eclipse.swt.widgets.Text; 
import org.eclipse.swt.widgets.ToolBar; 
import org.eclipse.swt.widgets.ToolItem; 

public class BrowserTest 
{ 
    private static Browser browser; 

    public static void main(String [] args) 
    { 
     Display display = new Display(); 
     final Shell shell = new Shell(display); 
     GridLayout gridLayout = new GridLayout(); 
     gridLayout.numColumns = 3; 
     shell.setLayout(gridLayout); 

     createBrowser(shell); 

     browser.addProgressListener(new ProgressListener() 
     { 
      public void changed(ProgressEvent event) { 
      } 
      public void completed(ProgressEvent event) { 
       changeSomething(); 
      } 
     }); 

     shell.open(); 
     browser.setUrl("http://google.com"); 

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

    protected static void changeSomething() 
    { 
     String s = "var allLinks = document.getElementsByTagName('a'); " + 
       "for (var i=0, il=allLinks.length; i<il; i++) { " + 
        "elm = allLinks[i]; elm.style.border = 'thin solid red';" + 
       "}"; 

     System.out.println(browser.execute(s)); 
    } 

    private static void createBrowser(Shell shell) 
    { 
     ToolBar toolbar = new ToolBar(shell, SWT.NONE); 
     ToolItem itemGo = new ToolItem(toolbar, SWT.PUSH); 
     itemGo.setText("Go"); 

     GridData data = new GridData(); 
     data.horizontalSpan = 3; 
     toolbar.setLayoutData(data); 

     Label labelAddress = new Label(shell, SWT.NONE); 
     labelAddress.setText("Address"); 

     final Text location = new Text(shell, SWT.BORDER); 
     data = new GridData(); 
     data.horizontalAlignment = GridData.FILL; 
     data.horizontalSpan = 2; 
     data.grabExcessHorizontalSpace = true; 
     location.setLayoutData(data); 

     try { 
      browser = new Browser(shell, SWT.NONE); 
     } catch (SWTError e) { 
      System.out.println("Could not instantiate Browser: " + e.getMessage()); 
      //display.dispose(); 
      return; 
     } 
     data = new GridData(SWT.FILL, SWT.FILL, true, true); 
     data.horizontalSpan = 3; 
     browser.setLayoutData(data); 

     /* event handling */ 
     Listener listener = new Listener() 
     { 
      public void handleEvent(Event event) 
      { 
       ToolItem item = (ToolItem)event.widget; 
       String string = item.getText(); 
       if (string.equals("Go")) browser.setUrl(location.getText()); 
      } 
     }; 

     browser.addLocationListener(new LocationListener() { 
      public void changed(LocationEvent event) { 
       if (event.top) location.setText(event.location); 
      } 
      public void changing(LocationEvent event) { 
      } 
     }); 


     itemGo.addListener(SWT.Selection, listener); 
     location.addListener(SWT.DefaultSelection, new Listener() { 
      public void handleEvent(Event e) { 
       browser.setUrl(location.getText()); 
      } 
     });  
    } 
} 

>>延伸阅读

  1. Eclipse Article
  2. SWT Snippets

希望这会有所帮助。

+0

Thx,昨天以同样的方式完成它) – sdf 2011-04-17 07:20:46

+0

很好的例子!谢谢,正是我所需要的 – 2013-08-22 18:41:01

相关问题