Библиотеки для красивых диаграмм в SWT?[закрыто]

StackOverflow https://stackoverflow.com/questions/22816

  •  09-06-2019
  •  | 
  •  

Вопрос

Я знаю следующие библиотеки для рисования диаграмм в приложении SWT/Eclipse RCP:

Какие еще библиотеки существуют для рисования красивых диаграмм с помощью SWT?Или диаграммы на Java вообще?Ведь всегда можно вывести изображение...

Это было полезно?

Решение

Я не использовал BIRT или JGraph, однако в своем приложении SWT использую JFreeChart.Я нашел лучший способ использовать JFreeChart в SWT — создать составной кадр AWT и использовать функциональность AWT для 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 (в его защиту г-н.Гилберт плохо знает SWT и он создан для AWT).Мои две самые большие проблемы заключаются в том, что по мере того, как события AWT проходят через SWT, возникают некоторые ошибочные события, и из-за переноса кадра AWT JFreeChart становится существенно медленнее.

@zvikico

Идея размещения диаграммы на веб-странице, вероятно, не лучший вариант.Во-первых, есть несколько проблем: то, как Eclipse обрабатывает интеграцию веб-браузера на разных платформах, непоследовательно.Кроме того, насколько я понимаю, некоторые графические пакеты для Интернета являются серверными и требуют такой настройки, а также многие компании, включая мою, используют прокси-серверы, и иногда это создает проблемы с просмотром веб-страниц Eclipse.

Другие советы

SWTChart дает хорошие результаты для линейных, точечных, гистограмм и диаграмм с областями.API прост, и на веб-сайте есть множество примеров.Я прошел путь от поиска в Google до просмотра своих данных менее чем за час.

SWTChart

Вы могли бы этот один тоже

Он имеет возможность отображать данные в реальном времени с помощью вашего собственного поставщика данных.

enter image description here

Тот, который я использовал, это JChart2D и JFreeChart.Летом я создал живое приложение-плоттер и использовал для этого JFreeChart.Парень, начавший проект, использовал JChart2D, но я обнаружил, что в нем недостаточно возможностей для настройки внешнего вида диаграммы.

JChart2D должен быть очень быстрым, поэтому, если вам нужно построить график в реальном времени, взгляните на него, хотя у JFreeChart не было никаких проблем с построением графика несколько раз в секунду.

Также на сайте имеется целый список библиотек диаграмм. java2s.com

Я также искал библиотеку диаграмм для приложения Eclipse RCP, наткнулся на сообщение Калеба здесь и теперь определенно могу сам порекомендовать SWTChart.Для меня это намного быстрее, чем JFreeChart, и к тому же легко расширяется.Если бы мне действительно пришлось на что-то жаловаться, я бы сказал, что javadoc мог бы быть немного более многословным, но это просто для того, чтобы сказать, что все остальное отлично.

Есть также Графики ILOG JViews который выглядит довольно многофункциональным… если вы можете себе это позволить.Здесь есть дополнительная информация об использовании его с eclipse.

Я предлагаю вам попробовать jzy3d, простая Java-библиотека для построения трехмерных данных.Это для Java, AWT, Swing или SWT.

После оценки нескольких вариантов я решил использовать библиотеку JavaScript для отображения графиков в моем плагине Eclipse.Как уже предположил Звикико, в браузере можно отображать html-страницу.На странице html вы можете использовать одну из библиотек JavaScript для построения графика.Если вы используете Chartist, вы можете сохранить изображение как файл SVG из контекстного меню.

Некоторые библиотеки диаграмм JavaScript:

Пример изображения чартиста:

enter image description here

Пример 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

Редактировать

Я создал Java-оболочку для D3.js, см.

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

Еще есть JGraph, но я не уверен, что он предназначен только для графиков (т.узлы и ребра), а также диаграммы.

Вот что-то другое:очень удобно встраивать веб-страницы в представления SWT.Недавно я попробовал это, и это работает очень хорошо.Вы можете увидеть, куда это идет:для HTML существует множество красивых компонентов диаграмм, это может быть вариант.Просто убедитесь, что компонент работает только на стороне клиента (если вы не хотите запустить сервер).

Я не тестировал Flash, но почти уверен, что вы сможете заставить его работать (естественно, это означает, что для вашего программного обеспечения потребуется установленный плагин Flash).

JCharts это еще один вариант.Он похож на JFreeChart, но документация бесплатна.Он не имеет прямой поддержки SWT, но вы всегда можете сгенерировать изображение и встроить его в фрейм SWT.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top