'JFreeChart'에 해당되는 글 1건

  1. 2009.07.02 JavaFX와 JFreeChart
04.IT Knowledge/Java2009. 7. 2. 22:38
 Java Swing Framework에서 제공하는 Component를 JavaFX에서 가져다 쓰기 위해서는 SwingComponent 클래스를 이용하여 Wrapping을 하는 것이 필요하다.
 이 글에서는 단순한 Swing Component가 아닌 JFreeChart의 Chart를 JavaFX위에 올려보겠다.

 1. NetBeans download
  - http://www.netbeans.org에서 NetBeans IDE를 다운로드 받아 설치한다. 여기에서 설치 방법은 설명하지 않겠다.
   개인적인 경험으로 JavaFX를 프로그래밍 한다면 Eclipse보다 NetBeans를 사용할 것을 권한다. (조금 더 편한듯..)

 2. JFreeChart download
  - 우선 JFreeChart를 http://www.jfree.org/jfreechart/download.html에서 다운로드 받는다.
  다운로드 받은 압축파일을 해제한 후 디렉토리 아래의 lib 폴더의 jar들을 이후에 프로젝트의 값을 설정할 때 클래스 패스로 잡아준다.

 3. Write Sample Swing Class
  - 여기서는 JFreeChart에서 demo로 제공하는 BarChartDemo1 클래스를 변형하여 사용할 것이다. 원래의 소스에서는 ApplicationFrame 클래스를 상속하여 예제가 구성되어 있으나 여기서는 JPanel을 상속하여 JavaFX에서 호출 가능하도록 할 것이다.

다음은 아래의 소스를 구현한 스크린 샷이다.




////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// BarChart.java
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
package a.wrapper;

import java.awt.Color;
import java.awt.GradientPaint;

import javax.swing.JPanel;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;

public class BarChart extends JPanel {

    private static String series1 = "First";
    private static String series2 = "Second";
    private static String series3 = "Third";

    private static String category1 = "Category 1";
    private static String category2 = "Category 2";
    private static String category3 = "Category 3";
    private static String category4 = "Category 4";
    private static String category5 = "Category 5";

    private static DefaultCategoryDataset dataset;

    public BarChart() {
        CategoryDataset datasetResult = createDataset();
        JFreeChart chart = createChart(datasetResult);
        ChartPanel panel = new ChartPanel(chart);
        this.add(panel);
    }

    public void changeDataset(double val) {
        dataset.setValue(1.0 + 2 * val, series1, category1);
        dataset.setValue(2.0 + 2 * val, series1, category2);
        dataset.setValue(3.0 + 2 * val, series1, category3);
        dataset.setValue(4.0 + 2 * val, series1, category4);
        dataset.setValue(5.0 + 2 * val, series1, category5);

        dataset.setValue(1.0 + 3 * val, series2, category1);
        dataset.setValue(2.0 + 3 * val, series2, category2);
        dataset.setValue(3.0 + 3 * val, series2, category3);
        dataset.setValue(4.0 + 3 * val, series2, category4);
        dataset.setValue(5.0 + 3 * val, series2, category5);

        dataset.setValue(1.0 + 4 * val, series3, category1);
        dataset.setValue(2.0 + 4 * val, series3, category2);
        dataset.setValue(3.0 + 4 * val, series3, category3);
        dataset.setValue(4.0 + 4 * val, series3, category4);
        dataset.setValue(5.0 + 4 * val, series3, category5);
    }

    private static CategoryDataset createDataset() {
        dataset = new DefaultCategoryDataset();
        dataset.addValue(1.0, series1, category1);
        dataset.addValue(4.0, series1, category2);
        dataset.addValue(3.0, series1, category3);
        dataset.addValue(5.0, series1, category4);
        dataset.addValue(5.0, series1, category5);

        dataset.addValue(5.0, series2, category1);
        dataset.addValue(7.0, series2, category2);
        dataset.addValue(6.0, series2, category3);
        dataset.addValue(8.0, series2, category4);
        dataset.addValue(4.0, series2, category5);

        dataset.addValue(4.0, series3, category1);
        dataset.addValue(3.0, series3, category2);
        dataset.addValue(2.0, series3, category3);
        dataset.addValue(3.0, series3, category4);
        dataset.addValue(6.0, series3, category5);
        return dataset;
    }

    private static JFreeChart createChart(CategoryDataset dataset) {

        JFreeChart chart = ChartFactory.createBarChart(
                "Bar Chart Demo",         // chart title
                "Category",               // domain axis label
                "Value",                  // range axis label
                dataset,                  // data
                PlotOrientation.VERTICAL, // orientation
                true,                     // include legend
                true,                     // tooltips?
                false                     // URLs?
                );

        chart.setBackgroundPaint(Color.white);
        CategoryPlot plot = (CategoryPlot) chart.getPlot();
        NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
        rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
        BarRenderer renderer = (BarRenderer) plot.getRenderer();
        renderer.setDrawBarOutline(false);

        GradientPaint gp0 = new GradientPaint(0.0f,0.0f,Color.blue,0.0f,0.0f,new Color(0, 0, 64));
        GradientPaint gp1 = new GradientPaint(0.0f,0.0f,Color.green,0.0f,0.0f,new Color(0, 64, 0));
        GradientPaint gp2 = new GradientPaint(0.0f,0.0f,Color.red,0.0f,0.0f,new Color(64, 0, 0));

        renderer.setSeriesPaint(0, gp0);
        renderer.setSeriesPaint(1, gp1);
        renderer.setSeriesPaint(2, gp2);

        CategoryAxis domainAxis = plot.getDomainAxis();
        domainAxis.setCategoryLabelPositions(
                         CategoryLabelPositions.createUpRotationLabelPositions(Math.PI / 6.0)
                                             );

        return chart;
    }
}

 4. Write Wrapper Class
  - JavaFX 실행파일에서 호출할 Wrapper 클래스를 정의한다.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// BarChartWrapper.fx
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
package a.wrapper;

import javafx.ext.swing.SwingComponent;
import javax.swing.JPanel;
import java.awt.BorderLayout;

import org.jfree.data.category.CategoryDataset;

public class BarChartWrapper extends SwingComponent{

    var panel: JPanel;
    var centerPanel: JPanel;
    var northPanel: JPanel;

    var dataset: CategoryDataset;
    var chart: BarChart;

    public var top: SwingComponent on replace{
        northPanel.add( top.getJComponent(), BorderLayout.CENTER);
        panel.add(northPanel, BorderLayout.NORTH);
    }

    public var initValue: Double on replace{
        chart.changeDataset(initValue);
    }

    public override function createJComponent(){
        panel = new JPanel(new BorderLayout());
        centerPanel = new JPanel(new BorderLayout());
        northPanel = new JPanel(new BorderLayout());
        chart = new BarChart();
        centerPanel.add(chart, BorderLayout.CENTER);
        panel.add(centerPanel, BorderLayout.CENTER);
        return panel;
    }
}

 5. Write Main Class
  - JavaFX 실행파일을 작성한다.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Main.fx
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
package a.main;

import javafx.stage.Stage;
import javafx.scene.Scene;

import a.wrapper.BarChartWrapper;
import javafx.ext.swing.SwingButton;

var initVal = 1.0;

Stage {
    title: "JavaFX에서 JFreeChart를 사용해 보자.."
    scene: Scene {
        content: BarChartWrapper {
            width: 600
            height: 450
            initValue: bind {initVal}
            top: SwingButton{
                text: "차트 데이터 변경하기"
                action: function() {
                    initVal *= 2
                }
            }
        }
    }
}

// 누구든 언제든 궁금한 사항이 있으면 질문하시라..
// 당장 답글이 달리지는 않겠지만, 일주일 이내에 반드시 답글을 달아드리겠삼~~

Posted by 아주 오래된 미래