一、创建简单的浏览器
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);}@Overridepublic 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代码。