Bibliotecas para gráficos bonitos no SWT?[fechado]
Pergunta
Conheço as seguintes bibliotecas para desenhar gráficos em um aplicativo SWT/Eclipse RCP:
- Mecanismo de gráfico Eclipse BIRT (Links para um artigo sobre como usá-lo)
- JFreeChart
Quais outras bibliotecas existem para desenhar gráficos bonitos com SWT?Ou gráficos em Java em geral?Afinal, você sempre pode exibir uma imagem...
Solução
Não usei BIRT ou JGraph, porém uso JFreeChart em meu aplicativo SWT.Descobri que a melhor maneira de usar JFreeChart no SWT é criar um quadro AWT composto e usar a funcionalidade AWT para JFreeChart.A maneira de fazer isso é criando um composto
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);
Existem vários problemas em relação às implementações em diferentes plataformas, bem como o código SWT nele é muito pobre (em sua defesa, o Sr.Gilbert não conhece bem o SWT e é feito para AWT).Meus dois maiores problemas são que, à medida que os eventos AWT surgem através do SWT, alguns eventos errôneos são disparados e, devido ao empacotamento do quadro AWT, o JFreeChart se torna substancialmente mais lento.
@zvikico
A ideia de colocar o gráfico em uma página da web provavelmente não é uma boa opção.Existem alguns problemas: a forma como o Eclipse lida com a integração do navegador da web em diferentes plataformas é inconsistente.Além disso, pelo que entendi de alguns pacotes gráficos para a Web, eles são do lado do servidor, exigindo essa configuração. Muitas empresas, incluindo a minha, usam servidores proxy e, às vezes, isso cria problemas com a navegação na Web do Eclipse.
Outras dicas
SWTChart oferece bons resultados para gráficos de linhas, dispersão, barras e áreas.A API é simples e há vários exemplos no site.Passei de encontrá-lo no Google para visualizar meus dados em menos de uma hora.
Você pode gostar esse um também
Tem a capacidade de plotar dados em tempo real com seu próprio provedor de dados.
O que eu usei é JChart2D e JFreeChart.Fiz um aplicativo de plotter ao vivo durante o verão e usei o JFreeChart para isso.O cara que iniciou o projeto usou JChart2D, mas descobri que ele não tem opções suficientes para ajustar a aparência do gráfico.
Supõe-se que o JChart2D seja muito rápido, então se você precisar fazer uma plotagem ao vivo, dê uma olhada nele, embora o JFreeChart não tenha tido nenhum problema ao fazer uma plotagem algumas vezes por segundo.
Há também uma grande lista de bibliotecas de gráficos em java2s.com
Eu também estava procurando uma biblioteca de gráficos para um aplicativo Eclipse RCP, me deparei com a postagem de Caleb aqui e posso definitivamente recomendar o SWTChart agora mesmo.Para mim, é muito mais rápido que o JFreeChart, além de ser facilmente extensível.Se eu realmente tivesse que reclamar de alguma coisa, diria que o javadoc poderia ser um pouco mais detalhado, mas isso é apenas para dizer que todo o resto está ótimo.
Há também Gráficos ILOG JViews que parece bastante completo… se você puder pagar.Aqui há algumas informações adicionais sobre como usá-lo com o Eclipse.
Eu sugiro que você tente jzy3d, uma biblioteca Java simples para plotar dados 3D.É para java, em AWT, Swing ou SWT.
Após avaliar diversas opções decidi usar uma biblioteca JavaScript para mostrar gráficos em meu plugin Eclipse.Como zvikico já sugeriu, é possível mostrar uma página html em um navegador.Na página html você pode utilizar uma das bibliotecas JavaScript para fazer a plotagem real.Se você usar o Chartist, poderá salvar a imagem como arquivo SVG no menu de contexto.
Algumas bibliotecas de gráficos JavaScript:
Cartista: http://gionkunz.github.io/chartist-js
D3js: http://d3js.org
Flotar: http://www.flocharts.org/
Outras estruturas de gráficos JavaScript: https://en.wikipedia.org/wiki/Comparison_of_JavaScript_charting_frameworks
Imagem de exemplo cartista:
Exemplo de código 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;
}
}
Exemplo de página 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>
Para que isso funcione, chartist.js e chartist.min.css precisam ser baixados e colocados no mesmo local que o arquivo html.Você também pode incluí-los na web.Veja aqui outro exemplo:https://www.snip2code.com/Snippet/233633/Chartist-js-example
Editar
Criei um wrapper java para D3.js, veja
Há também o JGraph, mas não tenho certeza se é apenas para gráficos (ou seja,nós e arestas), ou se também faz gráficos.
Aqui está algo diferente:é muito útil incorporar páginas da web em visualizações SWT.Recentemente experimentei e funciona muito bem.Você pode ver onde isso vai dar:existem muitos componentes de gráficos bonitos para HTML, pode ser uma opção.Apenas certifique-se de que o componente seja apenas do lado do cliente (a menos que você queira iniciar um servidor).
Não testei o Flash, mas tenho certeza de que você conseguirá fazê-lo funcionar (naturalmente, isso significa que seu software exigirá a instalação do plug-in Flash).
JCharts é outra opção.É semelhante ao JFreeChart, mas a documentação é gratuita.Não possui suporte direto para SWT, mas você sempre pode gerar uma imagem e incorporá-la em um quadro SWT.