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