原生SWT集成Chromium

目录

 

一. 前言

二. SWT集成Chromium

1. 前期准备

2. 试跑

3. 前端js调用java接口获取数据

三. 总结


一. 前言

假设你已经看过了 还在用SWT开发UI吗-用JCEF吧

终于, SWT官方支持Chromium了, 最新的4.17版本在2020年9月已经支持, 废话不多说, 我们来尝尝鲜吧!

二. SWT集成Chromium

建议大家可以去看看这个SWT FAQ, 上面有更详细的描述

1. 前期准备

(1) JDK 1.8+ 64 bit : 我使用的版本是JDK 1.8_144 64 bit. 目前SWt官方仅支持64bit的平台

(2) 依赖包:

  • SWT-Chromium fragment (org.eclipse.swt.browser.chromium.<ws>.<os>.<arch>.jar): 
  • SWT fragment (org.eclipse.swt.<ws>.<os>.<arch>.jar)
  • CEF binary (com.make.chromium.cef.<ws>.<os>.<arch>.jar)

前面两个包可以到这里下载: https://download.eclipse.org/eclipse/downloads/drops4/R-4.17-202009021800/

第三个jar包可以到这里下载: http://dl.maketechnology.io/chromium-cef/rls/repository/plugins/com.make.chromium.cef.win32.win32.x86_64_0.4.0.202005172227.jar

以上三个jar包也可以去网盘下载: 链接:https://pan.baidu.com/s/1h847rlHylPiFE1gBS0t2Jg  提取码:9swg 

2. 试跑

怎么添加依赖配置环境, 我这里就不啰嗦了, 这里show一下我的项目结构

直接上代码

SwtJcef.java

package com.oysterview.swt.chromium;

import java.io.File;

import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTError;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class SwtJcef {
	public static void main(String[] args) {

		final Display display = new Display();
		Shell shell = new Shell(display);
		shell.setText("官方SWT集成Chromium");
		shell.setLayout(new FillLayout());
		Browser browser = null;
		try {
			//设置SWT.CHROMIUM, 表示使用Chromium样式
			browser = new Browser(shell, SWT.CHROMIUM);
		} catch (SWTError e) {
			e.printStackTrace();
		}
		
		if (browser != null) {
			
			String fileName = "html/doc-example_tutorial-dynamic-data.html";
			String url = "file:///" + new File(fileName).getAbsolutePath();
			System.out.println(new File(fileName).getAbsolutePath());
			browser.setUrl(url);
		}
		shell.open();
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch())
				display.sleep();
		}
		display.dispose();

	}
}

前端UI代码: html/doc-example_tutorial-dynamic-data.html

<!DOCTYPE html>
<html style="height: 100%">
   <head>
       <meta charset="utf-8">
   </head>
   <body style="height: 100%; margin: 0">
       <div id="container" style="height: 100%"></div>
       <script type="text/javascript" src="js/echarts.min.js"></script>
       <script type="text/javascript" src="js/echarts-gl.min.js"></script>
       <script type="text/javascript" src="js/ecStat.min.js"></script>
       <script type="text/javascript" src="js/dataTool.min.js"></script>
       <!-- <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts/map/js/china.js"></script> -->
       <!-- <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts/map/js/world.js"></script> -->
       <!-- <script type="text/javascript" src="https://api.map.baidu.com/api?v=2.0&ak=xfhhaTThl11qYVrqLZii6w8qE5ggnhrY&__ec_v__=20190126"></script> -->
       <!-- <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts/dist/extension/bmap.min.js"></script> -->
       <script type="text/javascript">
var dom = document.getElementById("container");
var myChart = echarts.init(dom);
var app = {};
option = null;
var base = +new Date(2014, 9, 3);
var oneDay = 24 * 3600 * 1000;
var date = [];

var data = [Math.random() * 150];
var now = new Date(base);

function addData(shift) {
    now = [now.getFullYear(), now.getMonth() + 1, now.getDate()].join('/');
    date.push(now);
    data.push((Math.random() - 0.4) * 10 + data[data.length - 1]);

    if (shift) {
        date.shift();
        data.shift();
    }

    // now = new Date(+new Date(now) + oneDay);
	now = new Date();
}

for (var i = 1; i < 100; i++) {
    addData();
}

option = {
    xAxis: {
        type: 'category',
        boundaryGap: false,
        data: date
    },
    yAxis: {
        boundaryGap: [0, '50%'],
        type: 'value'
    },
    series: [
        {
            // name:'成交',
            type:'line',
            smooth:true,
            symbol: 'none',
            stack: 'a',
            areaStyle: {
                normal: {}
            },
            data: data
        }
    ]
};

setInterval(function () {
    addData(true);
    myChart.setOption({
        xAxis: {
            data: date
        },
        series: [{
            // name:'成交',
            data: data
        }]
    });
}, 200);
if (option && typeof option === "object") {
    myChart.setOption(option, true);
}
       </script>
   </body>
</html>

运行一下:

完美!

3. 前端js调用java接口获取数据

package com.oysterview.swt.chromium;

import java.io.File;

import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTError;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.browser.BrowserFunction;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class SwtJcef {
	public static void main(String[] args) {

		final Display display = new Display();
		Shell shell = new Shell(display);
		shell.setText("官方SWT集成Chromium");
		shell.setLayout(new FillLayout());
		Browser browser = null;
		try {
			//设置SWT.CHROMIUM, 表示使用Chromium样式
			browser = new Browser(shell, SWT.CHROMIUM);
		} catch (SWTError e) {
			e.printStackTrace();
		}
		
		if (browser != null) {
			//注册函数, 给前端JS代码调用, 相当于在JS可以调用getDataFromJava来获取数据
			new BrowserFunction(browser, "getDataFromJava") {

				@Override
				public Object function(Object[] arguments) {
					//arguments是js调用getDataFromJava传送的参数
					System.out.println("get param from js: " + ((String) arguments[0]));
					//java返回数据给JS
					return new String[] { "java", "666", "888" };
				}

			};
			
//			String fileName = "html/doc-example_tutorial-dynamic-data.html";
			String fileName = "html/getDataFromJavaTest.html";
			String url = "file:///" + new File(fileName).getAbsolutePath();
			System.out.println(new File(fileName).getAbsolutePath());
			browser.setUrl(url);
		}
		shell.open();
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch())
				display.sleep();
		}
		display.dispose();

	}
}

我们在写一个html: getDataFromJavaTest.html

<!DOCTYPE html>
<html>
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>demo1</title> 

<script type="text/javascript">
function display(){
	//调用java接口
  var returnFromJavaArray = getDataFromJava("hi, 我是来自js的参数");
	//赋值
  document.getElementById("demo").innerHTML = returnFromJavaArray[0];
}		
</script>

</head>
<body>

<p>点击按钮执行 <em>display</em> 函数, 从Java获取数据</p>
<button onclick="display()">点这里</button>

<p id="demo">JS</p>

</body>
</html>

run一下:

点一下按钮:

 

三. 总结

本文使用原生的SWT集成Chromium, 实现使用Echart, 并能在前端调用Java数据接口获取数据, 进行展示

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值