【问题标题】:Libraries for pretty charts in SWT? [closed]SWT 中漂亮图表的库? [关闭]
【发布时间】:2010-09-06 13:46:09
【问题描述】:

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

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

【问题讨论】:

    标签: java eclipse charts swt


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      这里有一些不同之处:在 SWT 视图中嵌入网页非常棒。我最近试过了,效果很好。你可以看到这是怎么回事:有很多漂亮的 HTML 图表组件,它可能是一个选项。只需确保组件仅在客户端(除非您想启动服务器)。

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

      【讨论】:

        【解决方案3】:

        我没有使用过 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 变得非常慢。

        @zvikico

        将图表放入网页的想法可能不是一个好方法。有几个问题首先是 Eclipse 如何处理在不同平台上集成 Web 浏览器的方式不一致。此外,根据我对一些 web 图形包的理解,它们是服务器端需要这种设置,包括我在内的许多公司也使用代理服务器,有时这会导致 Eclipse 网页浏览出现问题。

        【讨论】:

        • 仅供参考,JFreeChart 有实验性的 SWT 集成。我们在生产应用程序中成功使用它。
        • 很遗憾,JFreeChart 的 LGPL 许可证与 Eclipse 公共许可证 (EPL) 不兼容。
        【解决方案4】:

        还有ILOG JViews Charts,它看起来功能齐全……如果你负担得起的话。 Here 是一些关于在 Eclipse 中使用它的附加信息。

        【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          SWTChart 为折线图、散点图、条形图和面积图提供了良好的结果。 API 很简单,网站上有很多示例。我在不到一个小时的时间内从在谷歌上找到它到查看我的数据。

          SWTChart

          【讨论】:

          • SWTChart 如何处理实时数据图表?据我所知,一个数据系列被完整地加载到图表中,并且没有办法在新值可用时更新它。我想这只是与我的表现有关。
          • SWTChart 在 EPL 下获得许可。
          • 它似乎不支持 svg 或 png 导出。
          • Stefan,您可以使用 David L. Moffett 制作的类将结果保存到图像中:stackoverflow.com/questions/32355656/…
          【解决方案7】:

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

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

          java2s.com上还有很多图表库

          【讨论】:

          • JChart2D 和 JFreeChart 均在 LGPL 下获得许可。
          【解决方案8】:

          我建议您尝试jzy3d,这是一个用于绘制 3d 数据的简单 java 库。它适用于 java、AWT、Swing 或 SWT。

          【讨论】:

          • Jz3d 在 BSD 下获得许可。
          【解决方案9】:

          你可能也喜欢this 一个

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

          【讨论】:

          【解决方案10】:

          我还在寻找 Eclipse RCP 应用程序的图表库,偶然发现了 Caleb 的帖子,现在我自己绝对可以推荐 SWTChart。对我来说,它比 JFreeChart 快得多,而且易于扩展。如果我真的要抱怨什么,我会说 javadoc 可能有点冗长,但这只是说其他一切都很好。

          【讨论】:

            【解决方案11】:

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

            一些 JavaScript 图表库:

            图表示例图片

            示例 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;
                }
            }
            

            示例 html 页面

            <!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 文件相同的位置。您也可以从网络中包含它们。另一个例子见这里: https://www.snip2code.com/Snippet/233633/Chartist-js-example

            编辑

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

            https://github.com/stefaneidelloth/javafx-d3

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-09-01
              • 1970-01-01
              • 1970-01-01
              • 2012-08-10
              • 1970-01-01
              相关资源
              最近更新 更多