SWT中漂亮图表的库?

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

  • Eclipse BIRT图表引擎 (链接到有关如何使用它的文章)
  • JFreeChart的

还有哪些其他库可以用SWT绘制漂亮的图表? 或者Java中的图表一般? 毕竟,你总是可以显示图像……

我没有使用过BIRT或JGraph,但是我在SWT应用程序中使用了JFreeChart。 我发现在SWT中使用JFreeChart的最佳方法是将复合体制作成AWT帧并使用AWTfunction进行JFreeChart。 这样做的方法是创建一个复合

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浏览器的方式存在一些问题是不一致的。 此外,根据我对网络的一些图形包的理解,他们是服务器端需要设置,也包括我的许多公司使用代理服务器,有时这会产生Eclipse Web浏览的问题。

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

SWTChart

你可能也喜欢这个

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

在此处输入图像描述

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

JChart2D应该非常快,所以如果你需要做现场绘图看看它,虽然JFreeChart没有任何问题每秒做一次情节几次。

java2s.com上还有很多图表库

我也在寻找Eclipse RCP应用程序的图表库,在这里偶然发现了Caleb的post,现在我自己也可以推荐SWTChart。 对我来说,它比JFreeChart快得多,而且易于扩展。 如果我真的不得不抱怨某事,我会说javadoc可能会更冗长,但这只是说其他一切都很棒。

还有ILOG JViews图表 ,看起来function齐全……如果你负担得起的话。 以下是与eclipse一起使用它的一些额外信息。

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

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

一些JavaScript图表库:

  • Chartist: http : //gionkunz.github.io/chartist-js

  • D3js: http ://d3js.org

  • 情节: http ://www.flotcharts.org/

  • 更多JavaScript图表框架: https : //en.wikipedia.org/wiki/Comparison_of_JavaScript_charting_frameworks

Chartist示例图片

在此处输入图像描述

示例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页面

       

为了使这个工作,需要下载chartist.js和chartist.min.css并将其放在与html文件相同的位置。 您也可以从网络中添加它们。 请看这里的另一个例子: https : //www.snip2code.com/Snippet/233633/Chartist-js-example

编辑

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

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

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

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

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

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