java SWT Browser实现浏览器功能并运行JavaScript代码

搜了好多中文教程,要么时间太久,要么太过于简略,没有干货。迫于无奈,硬着头皮去看官方源文档。还是有一点的收获。分享一下。

swt用于图形界面开发,关于他的初级介绍,建议去IBM的网站https://www.ibm.com/developerworks/cn/opensource/os-jface1/#artrelatedtopics,这个是一个简单的介绍。要想详细的了解,直接去eclipse官网:http://www.eclipse.org/swt这上面,应有尽有,唯一的不方便之处就是有些专业英语词汇比较难搞清楚,需要花一点时间慢慢消化。

我主要想用里面的浏览器Browser控件实现一些功能,所以重点了解了一下,发现它的功能很是强大。

一、创建简单的浏览器

import org.eclipse.swt.*;
import org.eclipse.swt.browser.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;

public class Myswt3 {

public static void main(String [] args) {
    
    Display display = new Display();
	final Shell shell = new Shell(display);
	shell.setLayout(new FillLayout());
	
	final Browser browser;
	try {
		browser = new Browser(shell, SWT.NONE);
	} catch (SWTError e) {
		System.out.println("Could not instantiate Browser: " + e.getMessage());
		display.dispose();
		return;
	}
	
	browser.setUrl("www.baidu.com"); //百度
	
    shell.open();
	while (!shell.isDisposed()) {
		if (!display.readAndDispatch()) display.sleep();
	}
	display.dispose();
}

上面的代码,除了browser.setURL("www.baidu.com")这句之外,其他都是必备的套路代码,可以直接粘贴复制。

我简要介绍一下:

1.Display 用于创建可视化的浏览器,它相当于所有组件的父组件。

2.shell 作用应该类似于窗体,它的parent是display

3.browser的try{}catch{}块用于创建浏览器,增加健壮性,其中SWT.NONE是关键语句,这表示默认调用系统的浏览器内核。不过也可以更改参数,比如SWT.Mozilla,调用火狐内核,但是这样还需要一些其他设置,比较麻烦,所以姑且用IE内核吧。

4.最后几行是加载和开始以及关闭释放内存的操作,全部都是套路。

二、运行javaScript代码


final String SCRIPT = "document.write('hello world')";

browser.addProgressListener(ProgressListener.completedAdapter(event -> {
		
		browser.execute(SCRIPT);
	}));

将上面两句添加进去,SCRIPT为javaScript代码,你可以写的很简单,也可以写的很复杂。

三、高级功能

这里面有一个很强大的功能是可以实现Html和java的交互,利用Javascript,可以将Html中的一些参数传递出来,在java的程序中进行运算,请看具体的实例

import org.eclipse.swt.*;
import org.eclipse.swt.browser.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;

public class Myswt3 {

public static void main(String [] args) {
	
	final String SCRIPT ="document.onmousedown = function(e) {if (!e) {e = window.event;} if (e) {mouseDown(e.clientX, e.clientY);}}";
	Display display = new Display();
	final Shell shell = new Shell(display);
	shell.setLayout(new FillLayout());
	
	final Browser browser;
	try {
		browser = new Browser(shell, SWT.NONE);
	} catch (SWTError e) {
		System.out.println("Could not instantiate Browser: " + e.getMessage());
		display.dispose();
		return;
	}
	
	
	
	browser.addProgressListener(ProgressListener.completedAdapter(event -> {
		
		
		final BrowserFunction function = new CustomFunction(browser, "mouseDown");
		
		browser.execute(SCRIPT);
	}));

	
	browser.setUrl("www.baidu.com");
	shell.open();
	
	
	while (!shell.isDisposed()) {
		if (!display.readAndDispatch()) display.sleep();
	}
	display.dispose();
}

static class CustomFunction extends BrowserFunction {
	CustomFunction (Browser browser, String name) {
		super (browser, name);
	}
	@Override
	public Object function (Object[] arguments) {
		System.out.println ("mouseDown: " + ((Number)arguments[0]).intValue() + "," + ((Number)arguments[1]).intValue());
		return null;
	}
}

}

我来具体的解释一下:

首先,在javaScript中定义了一个mousedown函数,他有两个参数就是x,y坐标,但是在代码中没有具体写这个函数的代码,只是声明要用到这样一个函数,而这个函数可以在java代码中进行完善。

定义一个CustomFunction类继承BrowserFunction类,在类中重写 public Object function()函数,而这个函数体就是mousedown的函数体

用于连接的语句就是:BrowserFunction function = new CustomFunction(browser, "mouseDown");

总体来说就是,

1.javaScript中只简单声明函数和参数

2.以这个函数的名称创建一个BrowserFunction对象

3.覆写BrowserFunction中的public Object function 函数,object arguments 是你自己定义的函数的要传入的参数,比如上例arguments[0],就时clientX,arguments[1]就是clientY,然后在内部具体的实现这个函数,最后加上return。

通过这个过程,将网页中的clientX,和clientY传到了java代码中进行了操作。

所以我们可以利用这个方法来实现更多的功能。

四、继续扩展

除了上面的方法进行交互外还有一种简单的方法,可以用更短的语句实现更多的功能。

browser.evaluate("return document.getElementById('myid').childNodes[0].nodeValue;")

可以使用evaluate函数直接返回值,其中return document.getElementById('myid').childNodes[0].nodeValue;是JavaScript代码。

(注:本代码来自eclipse 官网)

你可能感兴趣的:(Java)