我知道以下用于在 SWT/Eclipse RCP 应用程序中绘制图表的库:
- Eclipse BIRT 图表引擎(有关如何使用它的文章的链接)
- JFreeChart
还有哪些其他库可以用 SWT 绘制漂亮的图表?还是Java中的图表?毕竟,您始终可以显示图像...
我知道以下用于在 SWT/Eclipse RCP 应用程序中绘制图表的库:
还有哪些其他库可以用 SWT 绘制漂亮的图表?还是Java中的图表?毕竟,您始终可以显示图像...
我没有使用过 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 web 浏览出现问题。
SWTChart 为折线图、散点图、条形图和面积图提供了良好的结果。API 很简单,网站上有很多示例。我从在谷歌上找到它到在不到一个小时内查看我的数据。
你可能也喜欢这个
它能够使用您自己的数据提供者绘制实时数据。
我使用的是JChart2D和 JFreeChart。我在夏天做了一个实时绘图仪应用程序,并为此使用了 JFreeChart。启动该项目的人使用了 JChart2D,但我发现它没有足够的选项来调整图表的外观和感觉。
JChart2D 应该非常快,因此如果您需要进行实时绘图,请查看它,尽管 JFreeChart 每秒进行几次绘图没有任何问题。
java2s.com上还有很多图表库
我还在寻找 Eclipse RCP 应用程序的图表库,偶然发现了 Caleb 的帖子,现在我自己绝对可以推荐 SWTChart。对我来说,它比 JFreeChart 快得多,而且易于扩展。如果我真的要抱怨什么,我会说 javadoc 可能有点冗长,但这只是说其他一切都很好。
还有ILOG JViews Charts,它看起来功能齐全……如果你负担得起的话。 下面是一些关于在 eclipse 中使用它的附加信息。
我建议你试试jzy3d,一个用于绘制 3d 数据的简单 java 库。它适用于 java、AWT、Swing 或 SWT。
在评估了几个选项后,我决定使用 JavaScript 库在我的 Eclipse 插件中显示绘图。正如 zvikico 已经建议的那样,可以在浏览器中显示 html 页面。在 html 页面中,您可以利用其中一个 JavaScript 库来进行实际绘图。如果您使用 Chartist,您可以从上下文菜单中将图像保存为 SVG 文件。
一些 JavaScript 图表库:
图表师: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 页面:
<!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 包装器,请参阅
还有 JGraph,但我不确定这是否仅适用于图形(即节点和边),或者它是否也适用于图表。
这里有一些不同之处:在 SWT 视图中嵌入网页非常棒。我最近试过了,效果很好。你可以看到这是怎么回事:有很多漂亮的 HTML 图表组件,它可能是一个选项。只需确保该组件仅在客户端(除非您想启动服务器)。
我没有测试过 Flash,但我很确定你可以让它工作(当然,这意味着你的软件需要安装 Flash 插件)。
JCharts是另一种选择。它类似于 JFreeChart,但文档是免费的。它不直接支持 SWT,但您始终可以生成图像并将其嵌入到 SWT 框架中。