1. 程式人生 > >java SWT Browser實現瀏覽器功能並執行JavaScript程式碼

java SWT Browser實現瀏覽器功能並執行JavaScript程式碼

搜了好多中文教程,要麼時間太久,要麼太過於簡略,沒有乾貨。迫於無奈,硬著頭皮去看官方源文件。還是有一點的收穫。分享一下。

我主要想用裡面的瀏覽器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 官網)