JavaFX WebView調用Echarts


當選擇JavaFX搞事情的時候就注定了要與bug對抗到底,就算是一種倔強吧。

一、准備

首先需要准備好echarts.js,可以直接取官網下載最新版https://echarts.apache.org/zh/download.html

導入到resource文件夾下,然后准備個stage顯示圖表

package wangkaifeng.test;

import javafx.beans.value.ObservableValue;
        import javafx.concurrent.Worker.State;
        import javafx.application.Application;
        import javafx.scene.Scene;
        import javafx.scene.paint.Color;
        import javafx.scene.web.WebEngine;
        import javafx.scene.web.WebView;
        import javafx.stage.Stage;

public class JavaWebView extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        stage.setTitle("Web View Sample");
        WebView webView = new WebView();
        WebEngine webEngine = webView.getEngine();
        webEngine.load(this.getClass().getResource("/chart.html").toExternalForm());
        Scene scene = new Scene(webView, 900, 600, Color.web("lightgray"));
        stage.setScene(scene);
        webEngine.getLoadWorker().stateProperty().addListener((ObservableValue<? extends State> ov, State oldState, State newState) -> {
            if (newState == State.SUCCEEDED) {
                stage.show();
            }
        });
    }
    public static void main(String[] args) {
        launch(args);
    }
}

二、Echarts demo

1、折線圖

chart.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>ECharts</title>
    <!-- 引入 echarts.js -->
    <!-- 這里是加載剛下好的echarts.js,注意路徑 -->
    <script src="echarts.js"></script>
</head>
<body>
<!-- 為ECharts准備一個具備大小(寬高)的Dom -->
<div id="main" style="width: 800px;height:500px;"></div>
<script type="text/javascript">
    // 基於准備好的dom,初始化echarts實例

    var myChart = echarts.init(document.getElementById('main'), null, {renderer: 'svg'});
    // 指定圖表的配置項和數據
    var option = {
        title: {
            text: '折線圖堆疊'
        },
        tooltip: {
            trigger: 'axis'
        },
        legend: {
            data:['郵件營銷','聯盟廣告','視頻廣告','直接訪問','搜索引擎']
        },
        grid: {
            left: '3%',
            right: '4%',
            bottom: '3%',
            containLabel: true
        },
        toolbox: {
            feature: {
                saveAsImage: {}
            }
        },
        xAxis: {
            type: 'category',
            boundaryGap: false,
            data: ['周一','周二','周三','周四','周五','周六','周日']
        },
        yAxis: {
            type: 'value'
        },
        series: [
            {
                name:'郵件營銷',
                type:'line',
                stack: '總量',
                data:[120, 132, 101, 134, 90, 230, 210]
            },
            {
                name:'聯盟廣告',
                type:'line',
                stack: '總量',
                data:[220, 182, 191, 234, 290, 330, 310]
            },
            {
                name:'視頻廣告',
                type:'line',
                stack: '總量',
                data:[150, 232, 201, 154, 190, 330, 410]
            },
            {
                name:'直接訪問',
                type:'line',
                stack: '總量',
                data:[320, 332, 301, 334, 390, 330, 320]
            },
            {
                name:'搜索引擎',
                type:'line',
                stack: '總量',
                data:[820, 932, 901, 934, 1290, 1330, 1320]
            }
        ]
    };

    // 使用剛指定的配置項和數據顯示圖表。
    myChart.setOption(option);
    // 處理點擊事件並且跳轉到相應的百度搜索頁面
    myChart.on('click', function (params) {
        window.open('https://www.baidu.com/s?wd=' + encodeURIComponent(params.name));
    });
</script>
</body>
</html>

顯示效果:

2、圓餅圖

chart.html

<html>
<head>
    <meta charset="utf-8">
    <title>echarts測試</title>
    <script type="text/javascript" src="echarts.js"></script>
    <script type="text/javascript" src="jquery-1.7.1.min.js"></script>
</head>
<body>
<!-- 為 ECharts 准備一個具備大小(寬高)的 DOM -->
<div id="main" style="width: 600px;height:800px;"></div>
<script type="text/javascript">
    // 基於准備好的dom,初始化echarts實例
    var myChart = echarts.init(document.getElementById('main'));

    var option = {
        tooltip : {
            trigger: 'item',
            formatter: "{a} <br/>{b} : {c} ({d}%)"
        },
        title: {
            text: '某站點用戶訪問來源',
            subtext: '純屬虛構',
            x:'center'
        },
        legend: {
            orient: 'vertical',
            left: 'left',
            //這個為提示條,注意名稱要和data里的name一一對應
            data: ['視頻廣告','聯盟廣告', '郵件營銷', '直接訪問',"搜索引擎","黑客"]
        },

        series : [
            {
                name: '訪問來源',
                type: 'pie',
                radius: '55%',
                data:[
                    {value:235, name:'視頻廣告'},
                    {value:274, name:'聯盟廣告'},
                    {value:310, name:'郵件營銷'},
                    {value:335, name:'直接訪問'},
                    {value:1400, name:'搜索引擎'},
                    {value:230, name:'黑客'}
                ]
            }
        ]
    }
    // 使用剛指定的配置項和數據顯示圖表。
    myChart.setOption(option);
</script>
</body>
</html>

顯示效果:

三、圖表數據不顯示或點線不一致問題

在官方所給的柱狀圖demo中

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>第一個 ECharts 實例</title>
    <!-- 引入 echarts.js -->
    <script src="echarts.js"></script>
</head>
<body>
    <!-- 為ECharts准備一個具備大小(寬高)的Dom -->
    <div id="main" style="width: 600px;height:400px;"></div>
    <script type="text/javascript">
        // 基於准備好的dom,初始化echarts實例
        var myChart = echarts.init(document.getElementById('main'));
 
        // 指定圖表的配置項和數據
        var option = {
            title: {
                text: '第一個 ECharts 實例'
            },
            tooltip: {},
            legend: {
                data:['銷量']
            },
            xAxis: {
                data: ["襯衫","羊毛衫","雪紡衫","褲子","高跟鞋","襪子"]
            },
            yAxis: {},
            series: [{
                name: '銷量',
                type: 'bar',
                data: [5, 20, 36, 10, 10, 20]
            }]
        };
 
        // 使用剛指定的配置項和數據顯示圖表。
        myChart.setOption(option);
    </script>
</body>
</html>

不顯示數據

 

查找了資料說是Echarts版本4.x之后的新特性,在初始化是可以配置渲染方式為canvas或者svg,默認為canvas。

默認的canvas在瀏覽器上顯示沒有問題,但是在javafx界面上會顯示出現問題,所以需要將渲染方式改為svg,問題就能得到解決。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>第一個 ECharts 實例</title>
    <!-- 引入 echarts.js -->
    <script src="echarts.js"></script>
</head>
<body>
<!-- 為ECharts准備一個具備大小(寬高)的Dom -->
<div id="main" style="width: 600px;height:400px;"></div>
<script type="text/javascript">
    // 基於准備好的dom,初始化echarts實例
    var myChart = echarts.init(document.getElementById('main'), null, {renderer: 'svg'});
    // 指定圖表的配置項和數據
    var option = {
        title: {
            text: '第一個 ECharts 實例'
        },
        tooltip: {},
        legend: {
            data:['銷量']
        },
        xAxis: {
            data: ["襯衫","羊毛衫","雪紡衫","褲子","高跟鞋","襪子"]
        },
        yAxis: {},
        series: [{
            name: '銷量',
            type: 'bar',
            data: [5, 20, 36, 10, 10, 20]
        }]
    };

    // 使用剛指定的配置項和數據顯示圖表。
    myChart.setOption(option);
</script>
</body>
</html>

 同理如果折線圖出現點線不一致的問題也是因為渲染方式的問題,比如下面沒有設置svg方式:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM