搜了好多中文教程,要么时间太久,要么太过于简略,没有干货。迫于无奈,硬着头皮去看官方源文档。还是有一点的收获。分享一下。
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.最后几行是加载和开始以及关闭释放内存的操作,全部都是套路。
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 官网)