Pregunta

Conozco las siguientes bibliotecas para dibujar gráficos en una aplicación SWT/Eclipse RCP:

¿Qué otras bibliotecas existen para dibujar gráficos bonitos con SWT?¿O gráficos en Java en general?Después de todo, siempre puedes mostrar una imagen...

¿Fue útil?

Solución

No he usado BIRT ni JGraph, sin embargo uso JFreeChart en mi aplicación SWT.He descubierto que la mejor manera de usar JFreeChart en SWT es haciendo un marco AWT compuesto y usando la funcionalidad AWT para JFreeChart.La forma de hacerlo es creando un compuesto.

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);

Hay varios problemas con respecto a las implementaciones en diferentes plataformas, así como el código SWT que contiene es muy pobre (en su defensa, el Sr.Gilbert no conoce bien SWT y está hecho para AWT).Mis dos mayores problemas son que, a medida que los eventos AWT surgen a través de SWT, se activan algunos eventos erróneos y, debido al ajuste del marco AWT, JFreeChart se vuelve sustancialmente más lento.

@zvikico

La idea de poner el gráfico en una página web probablemente no sea una buena manera de hacerlo.En primer lugar, existen algunos problemas: la forma en que Eclipse maneja la integración del navegador web en diferentes plataformas es inconsistente.Además, según tengo entendido, algunos paquetes de gráficos para la web son del lado del servidor que requieren esa configuración, además muchas empresas, incluida la mía, utilizan servidores proxy y, a veces, esto crea problemas con la navegación web de Eclipse.

Otros consejos

SWTChart ofrece buenos resultados para gráficos de líneas, dispersión, barras y áreas.La API es sencilla y hay numerosos ejemplos en el sitio web.Pasé de encontrarlo en google a ver mis datos en menos de una hora.

SWTCráfico

Te podría gustar este uno también

Tiene la capacidad de trazar datos en tiempo real con su propio proveedor de datos.

enter image description here

Los que he usado son JChart2D y JFreeChart.Hice una aplicación de trazador en vivo durante el verano y usé JFreeChart para eso.El tipo que había iniciado el proyecto había usado JChart2D pero descubrí que no tiene suficientes opciones para modificar la apariencia del gráfico.

Se supone que JChart2D es muy rápido, así que si necesita realizar un trazado en vivo, échele un vistazo, aunque JFreeChart no tuvo ningún problema al realizar un trazado varias veces por segundo.

También hay una gran lista de bibliotecas de gráficos en java2s.com

También estaba buscando una biblioteca de gráficos para una aplicación Eclipse RCP, me topé con la publicación de Caleb aquí y definitivamente puedo recomendar SWTChart ahora.Para mí es mucho más rápido que JFreeChart y además es fácilmente extensible.Si realmente tuviera que quejarme de algo, diría que el javadoc podría ser un poco más detallado, pero esto es sólo para decir que todo lo demás es genial.

También hay Gráficos de ILOG JViews que parece bastante completo en cuanto a funciones... si te lo puedes permitir.Aquí Hay información adicional sobre su uso con eclipse.

te sugiero que pruebes jzy3d, una biblioteca Java sencilla para trazar datos 3D.Es para java, en AWT, Swing o SWT.

Después de evaluar varias opciones, decidí usar una biblioteca de JavaScript para mostrar gráficos en mi complemento Eclipse.Como ya sugirió zvikico, es posible mostrar una página html en un navegador.En la página html, puede utilizar una de las bibliotecas de JavaScript para realizar el trazado real.Si usa Chartist, puede guardar la imagen como archivo SVG desde el menú contextual.

Algunas bibliotecas de gráficos de JavaScript:

Imagen de ejemplo cartista:

enter image description here

Ejemplo 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;
    }
}

Ejemplo 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 esto funcione, es necesario descargar chartist.js y chartist.min.css y colocarlos en la misma ubicación que el archivo html.También podrías incluirlos desde la web.Vea aquí otro ejemplo:https://www.snip2code.com/Snippet/233633/Chartist-js-example

Editar

Creé un contenedor de Java para D3.js, consulte

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

También está JGraph, pero no estoy seguro de si es solo para gráficos (es decir,nodos y bordes), o si también hace gráficos.

Aquí hay algo diferente:Es muy útil incrustar páginas web en vistas SWT.Lo probé hace poco y funciona muy bien.Puedes ver hacia dónde va esto:Hay muchos componentes de gráficos hermosos para HTML, podría ser una opción.Solo asegúrese de que el componente sea solo del lado del cliente (a menos que desee iniciar un servidor).

No he probado Flash, pero estoy bastante seguro de que puedes hacerlo funcionar (naturalmente, esto significa que tu software requerirá el complemento Flash instalado).

JGráficos es otra opción.Es similar a JFreeChart pero la documentación es gratuita.No tiene soporte directo para SWT pero siempre puedes generar una imagen e incrustarla en un marco SWT.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top