java SWT Browser實現瀏覽器功能并運行JavaScript代碼

一、創建簡單的瀏覽器

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代碼。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/249375.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/249375.shtml
英文地址,請注明出處:http://en.pswp.cn/news/249375.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[JZOJ5866]【NOIP2018模擬9.13】指引

Description Input Output Sample Input 6 3 2 0 3 1 1 3 4 2 0 4 5 5 Sample Output 2 Data Constraint Hint 貪心,把旅行者和出口的x坐標降序排序。 然后從前往后掃,如果是出口,就把y坐標插進set里,如果是旅行者,就查…

scrapy框架之遞歸解析和post請求

今日概要 遞歸爬取解析多頁頁面數據scrapy核心組件工作流程scrapy的post請求發送今日詳情 1.遞歸爬取解析多頁頁面數據 - 需求:將糗事百科所有頁碼的作者和段子內容數據進行爬取切持久化存儲 - 需求分析:每一個頁面對應一個url,則scrapy工程需…

SmartGit 過期解決方案之 非商業版本安裝使用

作為前端開發的小伙伴一定有這樣的困惑,自己在日常的團隊協作配合時,提交代碼和解決沖突是我們最頭疼的問題,但是又不喜歡使用Eclipse或者IDEA這種超級占內存的編輯器,使用Git命令又是那么捉襟見肘,所以有一個好用的輕…

HDU6438 Buy and Resell 解題報告(一個有趣的貪心問題的嚴格證明)

寫在前面 此題是一個很容易想到的貪心題目,但是正確性的證明是非常復雜的。然而,目前網上所有題解并未給出本題貪心算法的任何正確性證明,全部僅停留在描述出一個貪心算法。本著對算法與計算機科學的熱愛(逃)&#xff…

Webpack不生成index.html

沒有導出你的最后2個插件,并且沒有指定html文件名dist,因為HtmlWebpackPlugin應該生成相對于path,下面是固定配置: var path require(path)var webpack require(webpack)var HtmlWebpackPlugin require(html-webpack-plugin);m…

CSS3筆記之定位篇(一)relative

知識點1:relative和absolute relative: 相對自身,并會限制內部absolute元素層疊 absolute: 相對容器,并受到父類容器relative的影響,比如:overflow:hidden/scroll fixed: 不受relative限制,只受z-index的…

洛谷P3066 [USACO12DEC]逃跑的BarnRunning Away From…

題面鏈接 一句話題意:給出以1號點為根的一棵有根樹,問每個點的子樹中與它距離小于等于l的點有多少個。 我:似乎并不好做啊。。。看了題解后大霧。。。 sol:考慮樹上差分,對于一個點,在他那個位置&#xff0…

vue使用webPack打包發布后頁面顯示空白

今天筆者將打包后,進行訪問,訪問到index.html,但是出現的是空白頁。 打包命令:npm run build,打包后的文件如下: 這是因為index.html中引入的css ,js 的路徑不對:如下圖 這個是因為webpack打包的時候引入…

第一次實驗報告

c程序實驗報告 姓名:黃志乾 實驗地點:教學樓514教室 實驗時間:3月19日實驗項目: 1、字符與ASCII碼 2、運算符與表達式的應用 3、順序結構應用程序 4、數學函數的算法描述 5、雞兔同籠的算法描述 6、確定坐標的算法描述…

Mac下Idea安裝Git報錯Xcrun問題的解決

使用過IDEA的小伙伴都知道,它和我們之前用過的Eclipse一樣強大,或者比他更強大。當它配合的Mac使用時,就會變得更得心應手,少去很多環境配置的環節。其中最典型的就是Git 由于Mac自帶就安裝了git, 大家可以通過終端輸入命令“git…

關于Django路由層簡單筆記

Django—路由層 URL配置(URLconf)就像Django 所支撐網站的目錄。它的本質是URL與要為該URL調用的視圖函數之間的映射表;你就是以這種方式告訴Django,對于客戶端發來的某個URL調用哪一段邏輯代碼對應執行。 1,簡單的路由配置 from django.urls…

hdu 5183

hdu 5183(Hash處理區間問題) 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid5183 題意:給出一個n個元素的數組,現在要求判斷 a1-a2a3-a4...../-an 中是否存在某個某個區間使得 ai-ai1ai2...(-1)j-iaj k?? 這個題要利用Hash就可以實現幾乎在 O(n) 的時間內實現查找判斷…

vue-cli,webpack安裝

第一步應該下載node.js這是安裝vue-cli的基礎工具。官網下載快捷安全可:https://nodejs.org/en/ 第二步打開命令面板找到你要安裝的位置 第三步就是安裝全局vue-cli 命令操作 npm intatll -g vue-cli 安裝完畢之后 可以檢查安裝版本即 vue -V 如下圖 這還不算完&…

CSS3筆記之定位篇(二)z-index

知識點1&#xff1a;z-index基礎 z-index&#xff1a;auto; 默認值 z-index: <integer> 整數 z-index: inherit 繼承 不考慮css3 還有定位元素的z-index才有作用 知識點2&#xff1a;z-index與定位元素 無嵌套&#xff1a;后來居上&#xff0c;哪個大哪個上 //在沒有…

JSP頁面傳值出現中文亂碼的問題

在接收值的jsp頁面代碼的body里添加&#xff1a; <%request.setCharacterEncoding("utf-8"); %> //這里是設置utf-8為jsp頁面的中文編碼方式 jsp頁面之間傳值&#xff1a; 發送信息的jsp腳本&#xff1a; session.setAttribute("user",rs.getString…

【我所認知的BIOS】— uEFI AHCI Driver(8) — Pci.Read()

【我所認知的BIOS】—> uEFI AHCI Driver(8) — Pci.Read()LightSeed6/19/2014社會一直在變。不曉得是不是社會變的太苦開&#xff0c;而我沒變所以我反而顯得單純了。辦一個居住證。幾年前辦的以為最終能夠一勞永逸的&#xff0c;后來續辦的是發現確實不難了。尼瑪&#xf…

springboot項目集成vue

vue的項目目錄如下&#xff1a; vue項目打包 首先進入項目目錄&#xff1a;cd 項目名 然后執行打包命令&#xff1a;npm run build隨后我們的項目中會多出一個dist文件夾&#xff1a;如下圖 然后將dist文件夾中的所有內容放到eclipse中的src/main/resources/static文件夾里面…

Vue項目啟動webpack報錯Module build failed: Error: No PostCSS Config found in......

自己寫的公司項目&#xff0c;今天需要提交到公司版本庫&#xff0c;可是在本地啟動正常的項目&#xff0c;拷貝到git文件目錄下突然報錯Module build failed: Error: No PostCSS Config found in......&#xff0c;源文件都沒有改動過&#xff01; 然后自己各種百度&#xff…

2.1對 特征歸一化 的一些理解

特征歸一化有很多不同的叫法&#xff0c;比如&#xff1a;特征縮放&#xff0c;Feature Normalization&#xff0c;Feature Scaling 數據標準化&#xff08;歸一化&#xff09;處理是數據挖掘的一項基礎工作&#xff0c;不同評價指標往往具有不同的量綱和量綱單位&#xff0c;這…

逆向工程生成的Mapper.xml以及*Example.java詳解

逆向工程生成的接口中的方法詳解 在我上一篇的博客中講解了如何使用Mybayis逆向工程針對單表自動生成mapper.java、mapper.xml、實體類&#xff0c;今天我們先針對mapper.java接口中的部分方法進行測試&#xff0c;以了解其作用。 先看表結構。。。 從下圖可以看到MBG根據數據表…