在许多平台中,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
则没有实现。
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可以设置值。
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);
}
}
分享到:
相关推荐
SWT自带的DateTime控件属实不好用,而且无法绑定到其他控件上。因此自己写一个日历控件用着方便,功能大致如下: 1、日历控件可自定义设置常见的几种日期格式; 2、可以绑定注册到其他控件如:文本框、按钮、标签上...
映射标记 Java的“静态库链接” 姚博文 集成ACEGI 进行权限控制 SWT可交互式Browser控件 JDK配置(注意) RIA简介(第一部分) 在 Eclipse 中嵌入 NASA World Wind Java SDK, 用3DES加密解密 ...
java swt自定义控件java swt自定义控件java swt自定义控件java swt自定义控件
一个SWT日期时间选择控件类,可方便地加入到自己的代码中,支持拖放
swt自定义封装的日期时间选择控件,支持选择日期和时间
SWT/JFACE的控件库毕竟有限,在应用开发是我们不可避免地要自己开发一些自定义的控件
Java使用SWT JFreeChart控件实现的小游戏.zipJava使用SWT JFreeChart控件实现的小游戏.zipJava使用SWT JFreeChart控件实现的小游戏.zipJava使用SWT JFreeChart控件实现的小游戏.zipJava使用SWT JFreeChart控件实现的...
SWT 使用 OLE 函数调用com控件的资料 SWT 使用 OLE 函数调用com控件的资料SWT 使用 OLE 函数调用com控件的资料SWT 使用 OLE 函数调用com控件的资料 SWT 使用 OLE 函数调用com控件的资料
SWT Browser(内嵌浏览器)所需SWTResourceManager Jar包
SWT、JFACE控件实例,官方的东西,各种控件例子! 已经把包名等修复好了。直接导入IDE中可以运行。各种效果。
只要swt一个jar包即可,无需jacob,jna,jni等等,方法很简单
java浏览器控件 swt.jar 下载
SWT Table 单元格编辑实例代码
该文档包含swt所有控件的使用代码。大家可以不必为不知道某个控件怎么使用而犯愁。
SWT 第三方 date picker RCP
此例子完整的包含了swt 所需的jar文件及执行jar文件的bat文件。展示了swt 时间选择控件及其他控件的用法,以及TimerTask的用法。
git 地址 https://github.com/maketechnology/chromium.swt
对于swt控件知识的部分整理,有助于对其的学习。
NULL 博文链接:https://lifei114.iteye.com/blog/827368