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 官網)