隨筆-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 閱讀(5290) 評論(1)  編輯  收藏

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

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


          網站導航:
           
          主站蜘蛛池模板: 诸暨市| 张掖市| 内黄县| 凭祥市| 钦州市| 兴业县| 滁州市| 平远县| 玛沁县| 故城县| 永和县| 建湖县| 全州县| 巴东县| 苍溪县| 十堰市| 新田县| 郑州市| 鄢陵县| 赣州市| 乐清市| 岳普湖县| 玉田县| 南投市| 博白县| 赣州市| 集安市| 绵竹市| 浙江省| 同德县| 镇赉县| 宁南县| 新巴尔虎左旗| 乡城县| 清水县| 报价| 连南| 遵化市| 临漳县| 隆林| 佛坪县|