在许多平台中,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加密解密 ...
SWT是Eclipse IDE的基础,它通过与操作系统直接交互来提供本地化的图形用户界面,使得应用程序具有更高的性能和更好的外观。本文将深入探讨在Java中使用SWT进行自定义控件的开发。 ### 1. SWT概述 SWT是一个开源的...
这个控件允许用户方便地选取特定的日期和时间,提高了用户界面的交互性和用户体验。 在SWT中,虽然有基础的日期和时间输入组件,但它们的功能相对有限,不便于用户直观地进行日期和时间的选择。因此,开发人员常常...
在给定的资源中,“SWT日期时间选择控件类”是一个专门为SWT环境设计的控件,使得开发者能够轻松地在Java应用中集成日期和时间选择功能,并且支持拖放操作,提高了用户体验。 这个控件类可能是基于SWT的`Combo`或`...
SWT Browser(内嵌浏览器)所需SWTResourceManager Jar包
嵌入Word控件通常涉及到ActiveX技术,这是微软提供的一种组件对象模型,允许开发人员在Windows平台上创建和使用交互式的、动态链接的软件组件。在Java中,通过JACOB(Java COM Bridge)或者其他类似的库,可以实现对...
OCE(Open Component Environment)可能是指开放组件环境,它可能与Eclipse插件系统有关,允许开发者将SWT控件和其他组件集成到一个可扩展的环境中。然而,"oce"标签在SWT上下文中并不常见,可能需要进一步的信息来...
SWT是底层的GUI库,提供了与操作系统直接交互的组件,而JFace则建立在SWT之上,提供了一层抽象,简化了GUI的开发过程。 ### SWT基础知识 SWT是一个开源的Java库,它允许开发者使用原生操作系统提供的控件来创建GUI...
本文将深入探讨如何使用Draw2D模拟SWT中的RadioButton和CheckedBox控件,以及这些控件在实际应用中的作用和实现方式。 首先,RadioButton和CheckedBox是GUI中的两种常见选择控件。RadioButton通常用于提供一组互斥...
2. **设计属性**:为控件提供可配置的属性,如行高、颜色列表等。 ```java public void setColorList(Vector<Color> colors) { this.colors = colors; // 更新显示 } public Vector<Color> getColorList() { ...
### SWT Table单元格编辑功能详解 在Java图形用户界面(GUI)开发中,SWT...通过以上步骤,我们可以在SWT `Table`控件中实现单元格的编辑功能,使用户能够直接在界面上修改数据,提高了应用的交互性和实用性。
在“SWT 时间控件及执行bat文件”这个例子中,我们将探讨如何使用SWT来创建时间选择控件,以及如何利用Java的TimerTask类进行定时任务,同时还会学习如何通过批处理(bat)文件运行Java应用程序。 1. SWT时间控件:...
在SWT中,数据绑定是一种将业务对象(通常称为bean)的属性与UI控件的值进行关联的技术,使得UI的变化能够实时反映到数据模型中,反之亦然。这种双向绑定机制极大地简化了UI与数据模型之间的交互,提高了代码的...
**SWT控件详解** SWT(Standard Widget Toolkit)是由Eclipse基金会开发并维护的一套用于构建图形用户界面(GUI)的开源库,它是Java语言中的一个GUI工具包,主要面向那些希望创建高性能、原生外观的应用程序的...
Java使用SWT JFreeChart控件实现的小游戏.zipJava使用SWT JFreeChart控件实现的小游戏.zipJava使用SWT JFreeChart控件实现的小游戏.zipJava使用SWT JFreeChart控件实现的小游戏.zipJava使用SWT JFreeChart控件实现的...
在SWT中,虽然内建了一些基本的控件,但并没有内置日期选择器(date picker)组件。因此,为了在SWT应用中实现日期选择功能,通常会采用第三方库或插件来扩展这一功能,如"SWT 第三方 date picker RCP"。 这个描述...
在JAVA调用IE内核制作浏览器的过程中,SWT使用了一个名为`Browser`的类,这个类允许开发者创建一个内嵌的Web浏览器控件。它支持HTML、CSS、JavaScript等Web标准,并且可以执行复杂的Web应用程序。这种功能对于那些...
SWT 使用 OLE 函数调用com控件的资料 SWT 使用 OLE 函数调用com控件的资料SWT 使用 OLE 函数调用com控件的资料SWT 使用 OLE 函数调用com控件的资料 SWT 使用 OLE 函数调用com控件的资料