簡體   English   中英

我如何使用jfreeChart與Javafx2

[英]How i can use jfreeChart with 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等)集成?

這個答案討論了JavaFX中圖表集成的幾種不同方法。

使用FXGraphics2D橋來繪制JFreeChart

David Gilbert(JFreeChart創建者)創建了一個橋梁,允許使用JavaFX基元繪制JFreeChart。 該項目是FXGraphics2D:

FXGraphics2D是針對JavaFX Canvas的Graphics2D API的免費實現。 該代碼是為使用Orson Charts和JFreeChart而開發的,但對於使用Graphics2D API的任何代碼通常都很有用。

FXGraphics2D需要JDK 1.8.0或更高版本,並根據(三個子句)BSD風格的許可條款獲得許可。

有關詳細信息,請參閱FXGraphics2D站點以及Graphics2D和GraphicsContext之間的互操作性答案。

大衛在另一個答案的評論中指出:

FXGraphics2D現在直接集成在JFreeChart(版本1.0.18)中,因此現在包含JavaFX支持(需要JDK / JRE 1.8)。

解決方案在JavaFX中嵌入JFreeChart

使用Java 8中SwingNode在JavaFX應用程序中嵌入基於Swing的內容,例如JFreeChart

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功能比較

如果只有支持錯誤欄。 沒有它們,圖表框架對科學應用程序的價值要小得多。

Oracle Ensemble示例應用程序中JavaFX高級燭台圖演示了如何使用JavaFX構建燭台圖表 盡管誤差條與燭台不同,但我認為使用現有的JavaFX圖表庫可以很好地實現自定義錯誤條形圖,並且代碼最終會在很多方面與Ensemble燭台圖表示例類似。

但可以肯定的是,這一點仍然有效,一些諸如錯誤欄之類的東西目前將更容易實現,利用JFreeChart等成熟的庫。

正如Alexander指出的那樣,如果標准JavaFX圖表框架中缺少所需的功能,看起來它適用於廣泛的用戶,那么最好提交功能請求以將功能嵌入到標准庫中。 雖然某些高級圖表功能可能最適合用於JavaFX圖表的第三方擴展庫(其中目前沒有我知道的)。

現在可以使用FXGraphics2D在JavaFX Canvas上顯示JFreeChart實例, FXGraphics2D是JavaFX的Graphics2D API的免費實現。

JFreeChart是面向Swing的 - 雖然JFreeChart類本身不是Swing組件,但它通常顯示在org.jfree.chart.ChartPanel上,它是javax.swing.JPanel的子類。 它使用ava.awt.Graphics2D對象來繪制自己。

我想您可以使用JFreeChart的createBufferedImage()方法來獲取BufferedImage,然后使用SwingFXUtils將其轉換為javafx.scene.image.WritableImage,但之后您將失去圖表的交互性質。

不幸的是,目前似乎沒有任何方法可以在JavaFX中嵌入Swing組件

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM