Java SWT中的漂亮图表库?

Java SWT中的漂亮图表库?,java,eclipse,charts,swt,Java,Eclipse,Charts,Swt,我知道以下用于在SWT/Eclipse RCP应用程序中绘制图表的库: (链接到一篇关于如何使用它的文章) 还有哪些库可以使用SWT绘制漂亮的图表?还是Java中的图表?毕竟,您可以始终显示图像…还有JGraph,但我不确定这是否仅适用于图形(即节点和边),或者它是否也适用于图表。这里有一点不同:在SWT视图中嵌入网页非常重要。我最近试过,效果很好。您可以看到这一点:HTML有很多漂亮的图表组件,这可能是一个选项。只需确保该组件仅用于客户端(除非您想启动服务器) 我还没有测试过Flash,

我知道以下用于在SWT/Eclipse RCP应用程序中绘制图表的库:

  • (链接到一篇关于如何使用它的文章)

还有哪些库可以使用SWT绘制漂亮的图表?还是Java中的图表?毕竟,您可以始终显示图像…

还有JGraph,但我不确定这是否仅适用于图形(即节点和边),或者它是否也适用于图表。

这里有一点不同:在SWT视图中嵌入网页非常重要。我最近试过,效果很好。您可以看到这一点:HTML有很多漂亮的图表组件,这可能是一个选项。只需确保该组件仅用于客户端(除非您想启动服务器)


我还没有测试过Flash,但我很确定你可以让它工作(当然,这意味着你的软件需要安装Flash插件)。

我没有使用BIRT或JGraph,但是我在SWT应用程序中使用JFreeChart。我发现在SWT中使用JFreeChart的最佳方法是将一个组合框制作成AWT框架,并使用JFreeChart的AWT功能。实现这一点的方法是创建一个组合

Composite comp = new Composite(parent, SWT.NONE | SWT.EMBEDDED);
Frame frame = SWT_AWT.new_Frame(comp);
JFreeChart chart = createChart();
ChartPanel chartPanel = new ChartPanel(chart);
frame.add(chartPanel);
在跨不同平台的实现方面存在一些问题,其中的SWT代码非常差(Gilbert先生为其辩护时不太了解SWT,它是为AWT设计的)。我最大的两个问题是,当AWT事件在SWT中冒泡时,会触发一些错误事件,并且由于包装AWT框架,JFreeChart的速度会大大减慢

@兹维基科

将图表放入网页的想法可能不是一个好办法。有几个问题首先是Eclipse如何处理在不同平台上集成web浏览器的问题是不一致的。另外,从我对一些web绘图软件包的理解来看,它们是服务器端,需要这种设置,包括我在内的许多公司也使用代理服务器,这有时会给Eclipse web浏览带来问题。

还有一些看起来很完整的功能…如果您负担得起的话。
是关于在eclipse中使用它的一些附加信息

是另一种选择。它类似于JFreeChart,但文档是免费的。它不直接支持SWT,但您始终可以生成图像并将其嵌入SWT框架中。

SWTChart为直线图、散点图、条形图和面积图提供了良好的效果。API是直截了当的,网站上有很多例子。不到一个小时,我就从谷歌上找到了它,开始查看我的数据

我使用的是和JFreeChart。我在夏天做了一个实时绘图仪应用程序,并使用了JFreeChart。启动这个项目的人使用了JChart2D,但我发现它没有足够的选项来调整图表的外观

JChart2D应该非常快,所以如果需要进行实时绘图,请查看它,尽管JFreeChart每秒进行几次绘图没有任何问题

上还有很多图表库,我建议您试试,一个简单的用于绘制3d数据的java库。它适用于java、AWT、Swing或SWT。您可能也喜欢它

它能够使用您自己的数据提供程序绘制实时数据


我也在为Eclipse RCP应用程序寻找图表库,无意中发现了Caleb在这里的帖子,我现在肯定可以推荐SWTChart了。对我来说,它比JFreeChart快得多,而且易于扩展。如果我真的要抱怨什么,我会说javadoc可能会更详细一些,但这只是说其他的一切都很好。

在评估了几个选项后,我决定使用JavaScript库在我的Eclipse插件中显示绘图。正如zvikico已经提出的,可以在浏览器中显示html页面。在html页面中,您可以利用其中一个JavaScript库进行实际打印。如果使用ChartList,则可以从上下文菜单中将图像另存为SVG文件

一些JavaScript图表库:

  • 图表作者:

  • D3js:

  • 弗洛特:

  • 其他JavaScript图表框架:

图表列表示例图像

package org.treez.results.chartist;

import java.net.URL;

import javafx.application.Application;
import javafx.concurrent.Worker;
import javafx.geometry.HPos;
import javafx.geometry.VPos;
import javafx.scene.Scene;
import javafx.scene.layout.Region;
import javafx.scene.paint.Color;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
import netscape.javascript.JSObject;

public class WebViewSample extends Application {

    private Scene scene;

    @Override
    public void start(Stage stage) {
        // create the scene
        stage.setTitle("Web View");
        Browser browser = new Browser();
        scene = new Scene(browser, 750, 500, Color.web("#666970"));
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

class Browser extends Region {

    final WebView browser = new WebView();

    final WebEngine webEngine = browser.getEngine();

    public Browser() {

        //add the web view to the scene
        getChildren().add(browser);

        //add finished listener
        webEngine.getLoadWorker().stateProperty().addListener((obs, oldState, newState) -> {
            if (newState == Worker.State.SUCCEEDED) {
                executeJavaScript();
            }
        });

        // load the web page
        URL url = WebViewSample.class.getResource("chartist.html");
        String urlPath = url.toExternalForm();
        webEngine.load(urlPath);

    }

    private void executeJavaScript() {

        String script = "var chartist = new Chartist.Line(" + "'#chart'," + " " + "{"
                + " labels: [1, 2, 3, 4, 5, 6, 7, 8]," + "series: [" + " [5, 9, 7, 8, 5, 3, 5, 44]" + "]" + "}, " + ""
                + "{" + "  low: 0," + "  showArea: true" + "}" + "" + ");" + " var get = function(){return chartist};";

        webEngine.executeScript(script);

        Object resultJs = webEngine.executeScript("get()");

        //get line
        JSObject line = (JSObject) resultJs;
        String getKeys = "{var keys = [];for (var key in this) {keys.push(key);} keys;}";
        JSObject linekeys = (JSObject) line.eval(getKeys);

        JSObject options = (JSObject) line.eval("this.options");
        JSObject optionkeys = (JSObject) options.eval(getKeys);

        options.eval("this.showLine=false");

    }

    @Override
    protected void layoutChildren() {
        double w = getWidth();
        double h = getHeight();
        layoutInArea(browser, 0, 0, w, h, 0, HPos.CENTER, VPos.CENTER);
    }

    @Override
    protected double computePrefWidth(double height) {
        return 750;
    }

    @Override
    protected double computePrefHeight(double width) {
        return 500;
    }
}
<!DOCTYPE html>
<html>
<head>
    <link rel="stylesheet" type="text/css" href="chartist.min.css">       
</head>
<body>
    <div class="ct-chart" id="chart"></div>
    <script type="text/javascript" src="chartist.js"></script>
</body>
</html>

示例java代码

package org.treez.results.chartist;

import java.net.URL;

import javafx.application.Application;
import javafx.concurrent.Worker;
import javafx.geometry.HPos;
import javafx.geometry.VPos;
import javafx.scene.Scene;
import javafx.scene.layout.Region;
import javafx.scene.paint.Color;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
import netscape.javascript.JSObject;

public class WebViewSample extends Application {

    private Scene scene;

    @Override
    public void start(Stage stage) {
        // create the scene
        stage.setTitle("Web View");
        Browser browser = new Browser();
        scene = new Scene(browser, 750, 500, Color.web("#666970"));
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

class Browser extends Region {

    final WebView browser = new WebView();

    final WebEngine webEngine = browser.getEngine();

    public Browser() {

        //add the web view to the scene
        getChildren().add(browser);

        //add finished listener
        webEngine.getLoadWorker().stateProperty().addListener((obs, oldState, newState) -> {
            if (newState == Worker.State.SUCCEEDED) {
                executeJavaScript();
            }
        });

        // load the web page
        URL url = WebViewSample.class.getResource("chartist.html");
        String urlPath = url.toExternalForm();
        webEngine.load(urlPath);

    }

    private void executeJavaScript() {

        String script = "var chartist = new Chartist.Line(" + "'#chart'," + " " + "{"
                + " labels: [1, 2, 3, 4, 5, 6, 7, 8]," + "series: [" + " [5, 9, 7, 8, 5, 3, 5, 44]" + "]" + "}, " + ""
                + "{" + "  low: 0," + "  showArea: true" + "}" + "" + ");" + " var get = function(){return chartist};";

        webEngine.executeScript(script);

        Object resultJs = webEngine.executeScript("get()");

        //get line
        JSObject line = (JSObject) resultJs;
        String getKeys = "{var keys = [];for (var key in this) {keys.push(key);} keys;}";
        JSObject linekeys = (JSObject) line.eval(getKeys);

        JSObject options = (JSObject) line.eval("this.options");
        JSObject optionkeys = (JSObject) options.eval(getKeys);

        options.eval("this.showLine=false");

    }

    @Override
    protected void layoutChildren() {
        double w = getWidth();
        double h = getHeight();
        layoutInArea(browser, 0, 0, w, h, 0, HPos.CENTER, VPos.CENTER);
    }

    @Override
    protected double computePrefWidth(double height) {
        return 750;
    }

    @Override
    protected double computePrefHeight(double width) {
        return 500;
    }
}
<!DOCTYPE html>
<html>
<head>
    <link rel="stylesheet" type="text/css" href="chartist.min.css">       
</head>
<body>
    <div class="ct-chart" id="chart"></div>
    <script type="text/javascript" src="chartist.js"></script>
</body>
</html>
示例html页面

package org.treez.results.chartist;

import java.net.URL;

import javafx.application.Application;
import javafx.concurrent.Worker;
import javafx.geometry.HPos;
import javafx.geometry.VPos;
import javafx.scene.Scene;
import javafx.scene.layout.Region;
import javafx.scene.paint.Color;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
import netscape.javascript.JSObject;

public class WebViewSample extends Application {

    private Scene scene;

    @Override
    public void start(Stage stage) {
        // create the scene
        stage.setTitle("Web View");
        Browser browser = new Browser();
        scene = new Scene(browser, 750, 500, Color.web("#666970"));
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

class Browser extends Region {

    final WebView browser = new WebView();

    final WebEngine webEngine = browser.getEngine();

    public Browser() {

        //add the web view to the scene
        getChildren().add(browser);

        //add finished listener
        webEngine.getLoadWorker().stateProperty().addListener((obs, oldState, newState) -> {
            if (newState == Worker.State.SUCCEEDED) {
                executeJavaScript();
            }
        });

        // load the web page
        URL url = WebViewSample.class.getResource("chartist.html");
        String urlPath = url.toExternalForm();
        webEngine.load(urlPath);

    }

    private void executeJavaScript() {

        String script = "var chartist = new Chartist.Line(" + "'#chart'," + " " + "{"
                + " labels: [1, 2, 3, 4, 5, 6, 7, 8]," + "series: [" + " [5, 9, 7, 8, 5, 3, 5, 44]" + "]" + "}, " + ""
                + "{" + "  low: 0," + "  showArea: true" + "}" + "" + ");" + " var get = function(){return chartist};";

        webEngine.executeScript(script);

        Object resultJs = webEngine.executeScript("get()");

        //get line
        JSObject line = (JSObject) resultJs;
        String getKeys = "{var keys = [];for (var key in this) {keys.push(key);} keys;}";
        JSObject linekeys = (JSObject) line.eval(getKeys);

        JSObject options = (JSObject) line.eval("this.options");
        JSObject optionkeys = (JSObject) options.eval(getKeys);

        options.eval("this.showLine=false");

    }

    @Override
    protected void layoutChildren() {
        double w = getWidth();
        double h = getHeight();
        layoutInArea(browser, 0, 0, w, h, 0, HPos.CENTER, VPos.CENTER);
    }

    @Override
    protected double computePrefWidth(double height) {
        return 750;
    }

    @Override
    protected double computePrefHeight(double width) {
        return 500;
    }
}
<!DOCTYPE html>
<html>
<head>
    <link rel="stylesheet" type="text/css" href="chartist.min.css">       
</head>
<body>
    <div class="ct-chart" id="chart"></div>
    <script type="text/javascript" src="chartist.js"></script>
</body>
</html>

为了使其正常工作,需要下载chartist.js和chartist.min.css,并将其放置在与html文件相同的位置。你也可以从网上把它们包括进来。另一个例子请参见此处:

编辑

我为D3.js创建了一个java包装器,请参见


供参考,JFreeChart已经进行了实验性SWT集成。我们在生产应用程序中成功地使用了它。不幸的是,JFreeChart的LGPL许可证与Eclipse公共许可证(EPL)不兼容。SWTChart如何处理实时数据图表?据我所知,一个数据系列被完整地加载到图表中,没有一种方法可以在新值可用时用新值更新它。我想这只关系到我的性能。SWTChart是根据EPL授权的。它似乎不支持svg或png导出。Stefan,您可以使用David L.Moffett制作的类将结果保存到图像中。Jz3d是根据BSD授权的。它现在是根据EPL授权的Nebula Visualization Widget的一部分,入门页面如下:JChart2D和JFreeChart都是根据LGPL授权的。JViews已被RogueWave购买: