在許多
平臺(tái)中,Browser
控件皆被做為一個(gè)必需的控件給出,并提供了DOM接口,用于
訪問Browser的內(nèi)容,相對(duì)來說SWT中的Browser控件就比較薄弱,沒有提供DOM的可控制接口,那么,如何和控件所加載的
頁面進(jìn)行交互呢?比如需要在集成web
應(yīng)用的
環(huán)境中實(shí)現(xiàn)模仿登陸、
自動(dòng)填表等
功能。
SWT中對(duì)Browser有不同的實(shí)現(xiàn),目前實(shí)現(xiàn)的有IE和Mozilla。在Browser的構(gòu)造
函數(shù)中根據(jù)不同的平臺(tái)和不同的style
設(shè)置類決定使用哪個(gè)類的實(shí)現(xiàn)。
org.eclipse.swt.browser.Mozilla org.eclipse.swt.browser.IE 是已經(jīng)實(shí)現(xiàn)的,而其他的
org.eclipse.swt.browser.Safari org.eclipse.swt.browser.Voyager
來源:www.va1314.com/bc
則沒有實(shí)現(xiàn)。
public Browser (Composite parent, int style) {
super (checkParent (parent), checkStyle (style));
String platform = SWT.getPlatform ();
Display display = parent.getDisplay ();
if ("gtk".equals (platform)) display.setData (NO_INPUT_METHOD, null); //$NON-NLS-1$
String className = null;
if ((style & SWT.MOZILLA) != 0) {
className = "org.eclipse.swt.browser.Mozilla"; //$NON-NLS-1$
} else {
if ("win32".equals (platform) || "wpf".equals (platform)) { //$NON-NLS-1$ $NON-NLS-2$
className = "org.eclipse.swt.browser.IE"; //$NON-NLS-1$
} else if ("motif".equals (platform)) { //$NON-NLS-1$
className = "org.eclipse.swt.browser.Mozilla"; //$NON-NLS-1$
} else if ("gtk".equals (platform)) { //$NON-NLS-1$
className = "org.eclipse.swt.browser.Mozilla"; //$NON-NLS-1$
} else if ("carbon".equals (platform)) { //$NON-NLS-1$
className = "org.eclipse.swt.browser.Safari"; //$NON-NLS-1$
} else if ("photon".equals (platform)) { //$NON-NLS-1$
className = "org.eclipse.swt.browser.Voyager"; //$NON-NLS-1$
} else {
dispose ();
SWT.error (SWT.ERROR_NO_HANDLES);
}
}
try {
Class clazz = Class.forName (className);
webBrowser = (
WebBrowser)clazz.newInstance ();
} catch (ClassNotFoundException e) {
} catch (Illegal
AccessException e) {
} catch (InstantiationException e) {
}
if (webBrowser == null) {
dispose ();
SWT.error (SWT.ERROR_NO_HANDLES);
}
webBrowser.setBrowser (this);
webBrowser.create (parent, style);
}
public Browser (Composite parent, int style) {
super (checkParent (parent), checkStyle (style));
String platform = SWT.getPlatform ();
Display display = parent.getDisplay ();
if ("gtk".equals (platform)) display.setData (NO_INPUT_METHOD, null); //$NON-NLS-1$
String className = null;
if ((style & SWT.MOZILLA) != 0) {
className = "org.eclipse.swt.browser.Mozilla"; //$NON-NLS-1$
} else {
if ("win32".equals (platform) || "wpf".equals (platform)) { //$NON-NLS-1$ $NON-NLS-2$
className = "org.eclipse.swt.browser.IE"; //$NON-NLS-1$
} else if ("motif".equals (platform)) { //$NON-NLS-1$
className = "org.eclipse.swt.browser.Mozilla"; //$NON-NLS-1$
} else if ("gtk".equals (platform)) { //$NON-NLS-1$
className = "org.eclipse.swt.browser.Mozilla"; //$NON-NLS-1$
} else if ("carbon".equals (platform)) { //$NON-NLS-1$
className = "org.eclipse.swt.browser.Safari"; //$NON-NLS-1$
} else if ("photon".equals (platform)) { //$NON-NLS-1$
className = "org.eclipse.swt.browser.Voyager"; //$NON-NLS-1$
} else {
dispose ();
SWT.error (SWT.ERROR_NO_HANDLES);
}
}
try {
Class clazz = Class.forName (className);
webBrowser = (WebBrowser)clazz.newInstance ();
} catch (ClassNotFoundException e) {
} catch (IllegalAccessException e) {
} catch (InstantiationException e) {
}
if (webBrowser == null) {
dispose ();
SWT.error (SWT.ERROR_NO_HANDLES);
}
webBrowser.setBrowser (this);
webBrowser.create (parent, style);
}
其中對(duì)IE的實(shí)現(xiàn)主要是采用調(diào)用IE的Activex控件,間接加載IE,對(duì)Mozilla由于
代碼過多,本人沒有具體研究,其本身開源,有興趣能夠參看。
那么回歸主題,如何實(shí)現(xiàn)與Browser控件的交互呢? 其實(shí)仔細(xì)看Browser控件的API,能夠發(fā)覺一個(gè)execute()方法,這個(gè)方法適用于在web文檔加載完畢時(shí)能夠
運(yùn)行javascript
code的。這樣的話,交互就變得簡單了,因?yàn)閖avascript是提供dom的支持的,既然能夠調(diào)用javascript,那么就能夠調(diào)用web頁面
中的每個(gè)節(jié)點(diǎn)了。控制的問題處理了,可是另外的問題來了。 如何從javascript的code里邊前往
數(shù)據(jù)呢?
比如我需要將一個(gè)<input type=text id=textid />的值前往到j(luò)ava
code中。其實(shí)采用的方法是很投機(jī)的,因?yàn)閑xecute()方法前往的結(jié)果是true or
false,那么對(duì)它做文章是沒有用的,我們看其他的api,能夠發(fā)覺:addStatusTextListener()方法。
這個(gè)方法能夠監(jiān)聽web頁面對(duì)于statusbar文本改變的值,并反映在java
code里面,那么我們只需通過javascript把前往的值寫到window.status,那么就能夠在javacode里取到了。
具體代碼請(qǐng)參考下面,對(duì)于Browser的承繼重寫,通過getValue能夠取得指定id的html 控件的值,通過setValue能夠設(shè)置值。
view plaincopy to clipboardprint?
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.browser.StatusTextEvent;
import org.eclipse.swt.browser.StatusTextListener;
import org.eclipse.swt.widgets.Composite;
public class CoolBrowser extends Browser implements StatusTextListener {
private final String DATA = "Browser_Data";
public CoolBrowser(Composite parent, int style) {
super(parent, style);
addStatusTextListener(this);
}
@Override
protected void checkSubclass() {
}
/**
* Get the value of one input control in the web
* @param id
* @return
*/
public String getValue(String id) {
if (execute("var obj = document.getElementById('" + id + "');"
+ "if( obj != null ) window.status=obj.value;")) {
return (String) getData(DATA);
}
return null;
}
/**
* Set the value of the input control
* @param id
* @param value
*/
public void setValue( String id, Object value ){
if (execute("var obj = document.getElementById('" + id + "');"
+ "if( obj != null ) obj.value='" + value + "';")) {
}
}
@Override
public void changed(StatusTextEvent event) {
setData(DATA, event.text);
}
}
posted on 2009-12-29 16:28
xiaoxinchen 閱讀(5287)
評(píng)論(1) 編輯 收藏