Pergunta

Conheço as seguintes bibliotecas para desenhar gráficos em um aplicativo SWT/Eclipse RCP:

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...

Foi útil?

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.

Gráfico SWT

Você pode gostar esse um também

Tem a capacidade de plotar dados em tempo real com seu próprio provedor de dados.

enter image description here

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:

Imagem de exemplo cartista:

enter image description here

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

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

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top