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

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

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

    隨筆-31  評論-2  文章-0  trackbacks-0
    在許多平臺中,Browser控件皆被做為一個必需的控件給出,并提供了DOM接口,用于訪問Browser的內容,相對來說SWT中的Browser控件就比較薄弱,沒有提供DOM的可控制接口,那么,如何和控件所加載的頁面進行交互呢?比如需要在集成web應用環境中實現模仿登陸、自動填表等功能
    SWT中對Browser有不同的實現,目前實現的有IE和Mozilla。在Browser的構造函數中根據不同的平臺和不同的style設置類決定使用哪個類的實現。

    org.eclipse.swt.browser.Mozilla org.eclipse.swt.browser.IE 是已經實現的,而其他的 org.eclipse.swt.browser.Safari org.eclipse.swt.browser.Voyager
    來源:www.va1314.com/bc
    則沒有實現。


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

    }

    其中對IE的實現主要是采用調用IE的Activex控件,間接加載IE,對Mozilla由于代碼過多,本人沒有具體研究,其本身開源,有興趣能夠參看。

    那么回歸主題,如何實現與Browser控件的交互呢? 其實仔細看Browser控件的API,能夠發覺一個execute()方法,這個方法適用于在web文檔加載完畢時能夠運行javascript code的。這樣的話,交互就變得簡單了,因為javascript是提供dom的支持的,既然能夠調用javascript,那么就能夠調用web頁面 中的每個節點了。控制的問題處理了,可是另外的問題來了。 如何從javascript的code里邊前往數據呢? 比如我需要將一個<input type=text id=textid />的值前往到java code中。其實采用的方法是很投機的,因為execute()方法前往的結果是true or false,那么對它做文章是沒有用的,我們看其他的api,能夠發覺:addStatusTextListener()方法。 這個方法能夠監聽web頁面對于statusbar文本改變的值,并反映在java code里面,那么我們只需通過javascript把前往的值寫到window.status,那么就能夠在javacode里取到了。 具體代碼請參考下面,對于Browser的承繼重寫,通過getValue能夠取得指定id的html 控件的值,通過setValue能夠設置值。 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 閱讀(5284) 評論(1)  編輯  收藏

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

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 国产99久久亚洲综合精品| 91亚洲国产成人久久精品网址 | 亚洲一区二区中文| 中文字幕无线码免费人妻| 永久免费看bbb| 亚洲人成电影网站色www| 免费无码精品黄AV电影| 亚洲中文无码永久免| 破了亲妺妺的处免费视频国产 | 亚洲国产综合自在线另类| 99久9在线|免费| 亚洲国产精品午夜电影| 成年女人毛片免费观看97| 亚洲综合成人婷婷五月网址| 日韩毛片无码永久免费看| 国产亚洲人成在线影院| 一本久久综合亚洲鲁鲁五月天| 永久亚洲成a人片777777| 一级毛片免费毛片毛片| 亚洲精品无码专区在线在线播放 | 亚洲人成电影在线观看青青| 国产免费久久精品99re丫y| 亚洲人成人77777在线播放| 永久免费视频v片www| 国产乱妇高清无乱码免费| 亚洲国产美国国产综合一区二区| 美女啪啪网站又黄又免费| 亚洲综合色视频在线观看| 九九精品成人免费国产片| 亚洲人成影院77777| 免费鲁丝片一级观看| 一区二区三区精品高清视频免费在线播放 | 亚洲精品伊人久久久久| 在线看片人成视频免费无遮挡| 亚洲AV中文无码字幕色三| 久久精品免费视频观看| 亚洲国产一区二区三区在线观看| 日韩精品无码一区二区三区免费| 亚洲成网777777国产精品| 日本一卡精品视频免费| 亚洲日韩精品无码AV海量|