<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-31  評(píng)論-2  文章-0  trackbacks-0
    在許多平臺(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 (IllegalAccessException 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)  編輯  收藏

    評(píng)論:
    # re: SWT可交互式Browser控件 2009-12-30 19:51 | 凡客誠品羽絨服
    來訪來電來訪的浪費(fèi)  回復(fù)  更多評(píng)論
      

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 国产黄色片在线免费观看| 国产一级淫片视频免费看| 免费国产成人午夜私人影视 | 看成年女人免费午夜视频| 免费人成激情视频在线观看冫| 亚洲阿v天堂在线2017免费| 九九综合VA免费看| 99久久免费精品视频| 成在人线av无码免费高潮水| 5g影院5g天天爽永久免费影院| 国产成人免费片在线观看| 免费真实播放国产乱子伦| 亚洲AV无一区二区三区久久| 亚洲AV无码无限在线观看不卡 | 久久青青草原亚洲av无码app| 亚洲AV永久无码精品一福利| 亚洲国产无线乱码在线观看| 蜜臀亚洲AV无码精品国产午夜.| 国产亚洲精品欧洲在线观看| 日韩在线永久免费播放| 四虎影视永久免费观看网址| 78成人精品电影在线播放日韩精品电影一区亚洲 | 无码专区永久免费AV网站| 国产亚洲精久久久久久无码77777| 亚洲一区在线视频观看| 亚洲精品456人成在线| 免费一区二区无码东京热| 精品剧情v国产在免费线观看 | 久久精品成人免费看| 国产精品免费综合一区视频| 亚洲男人天堂av| 国产 亚洲 中文在线 字幕| 99视频免费在线观看| 亚洲精品在线免费观看| 国产午夜亚洲不卡| 亚洲精品V天堂中文字幕| 99视频精品全部免费观看| 久久亚洲欧洲国产综合| 亚洲AV无码资源在线观看| 精品国产污污免费网站aⅴ| 亚洲日韩精品射精日|