Как я могу использовать jfreeChart с Javafx2

Для приложения JavaFX2 мне нужно показать различные типы диаграмм. Я использую jfreeChart для создания диаграмм и код, приведенный ниже:

public static JFreeChart generatePieChart() {
        DefaultPieDataset dataSet = new DefaultPieDataset();
        dataSet.setValue("China", 25);
        dataSet.setValue("India", 25);
        dataSet.setValue("United States", 50);
        JFreeChart chart = ChartFactory.createPieChart(
                "World Population by countries", dataSet, true, true, false);

        return chart;
    }

Это возвращает мне объект диаграммы. Как я могу интегрировать это с моим узлом JavaFx, таким как HBox и т. Д.?


person java baba    schedule 22.05.2013    source источник
comment
На какой технологии основан JFreeChart? АВТ? Качать?   -  person Alexander Kirov    schedule 22.05.2013


Ответы (4)


JFreeChart ориентирован на Swing — хотя сам класс JFreeChart не является компонентом Swing, он обычно отображается в org.jfree.chart.ChartPanel, который является подклассом javax.swing.JPanel. Он использует объект ava.awt.Graphics2D для рисования самого себя.

Я предполагаю, что вы можете использовать метод createBufferedImage() JFreeChart для получения BufferedImage, а затем использовать SwingFXUtils для преобразования его в javafx.scene.image.WritableImage, но тогда вы потеряете интерактивный характер диаграммы.

К сожалению, на данный момент нет способа встроить компонент Swing в JavaFX.

person GreyBeardedGeek    schedule 22.05.2013
comment
Для JFreeChart в JavaFX я бы рекомендовал использовать новую реализацию FXGraphics2D, которую я разместил на GitHub: github.com/jfree/fxgraphics2d - person David Gilbert; 20.05.2014
comment
FXGraphics2D теперь интегрирован непосредственно в JFreeChart (в версии 1.0.18), поэтому теперь включена поддержка JavaFX (требуется JDK/JRE 1.8). - person David Gilbert; 23.07.2014

В этом ответе обсуждается несколько различных подходов к интеграции диаграмм в JavaFX.

Использование моста FXGraphics2D для рисования JFreeChart

Дэвид Гилберт (создатель JFreeChart) создал мост, который позволяет рисовать JFreeChart с использованием примитивов JavaFX. Проект FXGraphics2D:

FXGraphics2D — это бесплатная реализация Graphics2D API, предназначенная для холста JavaFX. Код был разработан для использования Orson Charts и JFreeChart, но в целом будет полезен для любого кода, использующего Graphics2D API.

FXGraphics2D требует JDK 1.8.0 или более поздней версии и лицензируется в соответствии с условиями лицензии (три пункта) в стиле BSD.

См. сайт FXGraphics2D и ответ на Взаимодействие между Graphics2D и GraphicsContext для получения дополнительной информации.

Дэвид отмечает в комментарии к другому ответу:

FXGraphics2D теперь интегрирован непосредственно в JFreeChart (в версии 1.0.18), поэтому теперь включена поддержка JavaFX (требуется JDK/JRE 1.8).

Решение по внедрению JFreeChart в JavaFX

Используйте SwingNode из Java 8 для встраивания контента на основе Swing, такого как JFreeChart в приложениях JavaFX.

jfreechart

import javafx.application.Application;
import javafx.embed.swing.SwingNode;
import javafx.scene.*;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import org.jfree.chart.*;
import org.jfree.data.general.DefaultPieDataset;
 
public class JFreeChartSwingNodePopulationPieChart extends Application {
  @Override public void start(Stage stage) {
    final SwingNode chartSwingNode = new SwingNode();

    chartSwingNode.setContent(
      new ChartPanel(
        generatePieChart()
      )      
    );

    stage.setScene(
      new Scene(
        new StackPane(    
          chartSwingNode
        )    
      )
    );
    
    stage.show();
  }

  private JFreeChart generatePieChart() {
    DefaultPieDataset dataSet = new DefaultPieDataset();
    dataSet.setValue("China",        1344.0);
    dataSet.setValue("India",        1241.0);
    dataSet.setValue("United States", 310.5);

    return ChartFactory.createPieChart(
      "Population 2011", dataSet, true, true, false
    );
  }  
  
  public static void main(String[] args) { launch(args); }
}

Альтернативное решение с использованием диаграмм JavaFX

Используйте собственную структуру построения диаграмм от JavaFX.

Диаграммы JavaFX не обладают точно такой же функциональностью, как JFreeChart, но отлично подходят для многих приложений.

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

populationpiejavafx

import javafx.application.Application;
import javafx.collections.*;
import javafx.scene.*;
import javafx.scene.chart.*;
import javafx.stage.Stage;
 
public class JavaFXPopulationPieChart extends Application {
  @Override public void start(Stage stage) {
    final PieChart chart = new PieChart(
      FXCollections.observableArrayList(
        new PieChart.Data("China",         1344.0),
        new PieChart.Data("India",         1241.0),
        new PieChart.Data("United States",  310.5)
      )      
    );
    chart.setTitle("Population 2011");

    stage.setScene(new Scene(chart));
    stage.show();
  }

  public static void main(String[] args) { launch(args); }
}

О функциональном сравнении JavaFX и JFreeChart

Если бы только была поддержка баров ошибок. Без них структура диаграмм имеет гораздо меньше ценности для научных приложений.

Расширенный свечной график JavaFX из примера Oracle Ensemble демонстрирует, как использовать JavaFX для построения свечного графика. Несмотря на то, что столбики погрешностей отличаются от свечей, я думаю, что реализация собственного гистограммы погрешностей будет вполне возможно, используя существующую библиотеку графиков JavaFX, и код в конечном итоге во многом будет похож на пример свечного графика Ensemble.

Но, конечно, точка зрения по-прежнему актуальна, некоторые вещи, такие как планки погрешностей, в настоящее время будет проще реализовать с помощью зрелой библиотеки, такой как JFreeChart.

Как указывает Александр, если в стандартной структуре построения диаграмм JavaFX отсутствуют необходимые функции, которые, похоже, будут применимы для широкого круга пользователей, то лучше отправьте запрос на функцию, чтобы получить функциональность, встроенную в стандартную библиотеку. Хотя некоторые виды расширенных функций диаграмм, вероятно, лучше всего обрабатываются сторонней библиотекой расширений для построения диаграмм JavaFX (из которых в настоящее время нет доступных, о которых я знаю).

person jewelsea    schedule 22.05.2013
comment
Если бы только была поддержка баров ошибок. Без них структура диаграмм имеет гораздо меньше ценности для научных приложений. - person scottb; 22.05.2013
comment
@scottb, вы можете подать RFE о планках ошибок, если их еще нет. - person Alexander Kirov; 22.05.2013
comment
@scottb Вы можете легко добавить планки ошибок самостоятельно. Приложение ансамбля JavaFX демонстрирует очень простую реализацию пользовательского графика свечных стержней. Если вы не возражаете против дополнительного кода, вы можете легко адаптировать образец для баров погрешностей. - person sarcan; 23.05.2013
comment
Тогда я посмотрю на это. Microsoft Excel имеет надежную поддержку генерации планок погрешностей в своей объектной модели ActiveX для графиков (она включает асимметричные планки погрешностей), которая работает со многими различными типами диаграмм, например. точечные диаграммы, гистограммы и т. д. Было бы неплохо, если бы диаграммы JavaFX предлагали аналогичный уровень поддержки прямо из коробки. - person scottb; 24.05.2013

Теперь можно отобразить экземпляр JFreeChart на холсте JavaFX с помощью FXGraphics2D, бесплатной реализации Graphics2D API для JavaFX.

person David Gilbert    schedule 20.05.2014
comment
Поддержка JavaFX теперь предоставляется в JFreeChart 1.0.18. - person David Gilbert; 04.07.2014

делаю это: chartSwingNode.setContent( new ChartPanel( generatePieChart() )
);

выдает эту ошибку только при запуске (код компилируется): >

Исключение в потоке «AWT-EventQueue-0» java.util.MissingResourceException: не удается найти ресурс для пакета java.util.PropertyResourceBundle, ключ Save_as в java.util.ResourceBundle.getObject(ResourceBundle.java:450) в java.util .ResourceBundle.getString(ResourceBundle.java:407) в org.jfree.chart.ChartPanel.createPopupMenu(ChartPanel.java:2785) в org.jfree.chart.ChartPanel.(ChartPanel.java:577) в org.jfree.chart .ChartPanel.(ChartPanel.java:523) на org.jfree.chart.ChartPanel.(ChartPanel.java:426)

person Shachar Oz    schedule 14.10.2019