3

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

これにより、チャート オブジェクトが返されます。これを HBox などの JavaFx ノードと統合するにはどうすればよいですか?

4

4 に答える 4

19

この回答では、JavaFX でチャートを統合するためのいくつかの異なるアプローチについて説明しています。

FXGraphics2D ブリッジを使用して JFreeChart をペイントする

David Gilbert (JFreeChart 作成者) は、JavaFX プリミティブを使用して JFreeChart を描画できるようにするブリッジを作成しました。プロジェクトは FXGraphics2D です。

FXGraphics2D は、JavaFX Canvas を対象とする Graphics2D API の無料実装です。このコードは、Orson Charts と JFreeChart を使用するために開発されましたが、Graphics2D API を使用するすべてのコードに一般的に役立ちます。

FXGraphics2D には JDK 1.8.0 以降が必要であり、(3 条項) BSD スタイルのライセンスの条件に基づいてライセンス供与されます。

詳細については、FXGraphics2Dサイトと、Interoperability between Graphics2D and GraphicsContextへの回答を参照してください。

デビッドは、別の回答に関するコメントで次のように述べています。

FXGraphics2D が JFreeChart (バージョン 1.0.18) に直接統合されたため、JavaFX サポートが含まれるようになりました (JDK/JRE 1.8 が必要)。

JFreeChart を JavaFX に埋め込むソリューション

Java 8のSwingNodeを使用して、JFreeChartなどの Swing ベースのコンテンツを JavaFX アプリケーションに埋め込みます。

フリーチャート

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 で簡単に複製できるため、そのようなチャートに外部ライブラリを使用する必要がなくなります。

人口パイjavafx

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 Advanced Candlestick Chartは、 JavaFX を使用してローソク足チャートを作成する方法を示しています。誤差範囲はローソク足とは異なりますが、既存の JavaFX チャート作成ライブラリを使用してカスタム誤差範囲グラフを実装することはかなり可能であり、コードは多くの点で Ensemble のローソク足チャートのサンプルと似ていると思います。

しかし、確かに、この点は依然として有効です。現在、エラー バーなどのいくつかは、JFreeChart などの成熟したライブラリを活用することで達成しやすくなります。

アレクサンダーが指摘するように、標準 JavaFX チャート作成フレームワークに必要な機能が欠けていて、それが幅広いユーザーに適用できるように思われる場合は、機能リクエストを提出して、標準ライブラリに組み込まれた機能を取得することをお勧めします。ある種の高度なチャート機能は、JavaFX チャート作成用のサードパーティの拡張ライブラリで処理するのがおそらく最適ですが (現時点で私が知っているものはありません)。

于 2013-05-22T16:43:03.160 に答える
7

JavaFX用の Graphics2D API の無料実装であるFXGraphics2Dを使用して、JavaFX Canvas に JFreeChart インスタンスを表示できるようになりました。

于 2014-05-20T08:53:49.090 に答える
2

JFreeChart は Swing 指向です。JFreeChart クラス自体は Swing コンポーネントではありませんが、通常、javax.swing.JPanel のサブクラスである org.jfree.chart.ChartPanel に表示されます。ava.awt.Graphics2D オブジェクトを使用して自分自身を描画します。

JFreeChart の createBufferedImage() メソッドを使用して BufferedImage を取得し、SwingFXUtils を使用してそれを javafx.scene.image.WritableImage に変換できると思いますが、そうするとチャートのインタラクティブな性質が失われてしまいます。

残念ながら、現時点では、Swing コンポーネントを JavaFX に埋め込む方法はないようです。

于 2013-05-22T14:39:32.013 に答える