공부/자바(JAVA)

자바 Swing(스윙) 차트 - JfreeChart

도도-도윤 2017. 10. 24. 21:10

자바 Swing(스윙) 차트 - JfreeChart


오픈소스로 개발된 JFreeChart에 대해서 소개하겠습니다.

자바 AWT, Swing 프레임워크를 통해서 구현하는 방법에 대해서 다뤄봤습니다.



1. 라이브러리


라이브러리 명

용도

링크

jFreeChart-1.0.19

 차트 구현

 링크(JFreeChart), 소스포지(SourceForge)

Orson-PDF 1.7

PDF 파일 인쇄

링크(Orson PDF)


jfreechart-1.0.19.zip

orsonpdf-1.7.zip




2. 사용 방법




 1. 라이브러리 추가하기




3. 소스코드


package JMain;


import JChart.*;

import java.awt.Font;

import javax.swing.JPanel;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.general.PieDataset;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
import java.awt.BorderLayout;
 
enum TypeChart{
      PIE, LINE, BAR, TIMESERIES
}


public class Chart_AWT extends ApplicationFrame {
   
       private JPanel contentPane;
       private JPanel chartPiePane;
       private JPanel chartLinePane;
       private static Chart_AWT window;
 
       public Chart_AWT( String title ) {
     
            super( title ); 
            getContentPane().setLayout(null);
            contentPane = new JPanel();
            getContentPane().add( contentPane );
      
            chartPiePane = new JPanel();
            chartPiePane.setBounds(27, 268, 662, 442);
            getContentPane().add(chartPiePane);
            chartPiePane.add( createDemoPanel( TypeChart.LINE ) );
                    
            chartLinePane = new JPanel();
            chartLinePane.setBounds(119, 10, 662, 442);
            getContentPane().add( chartLinePane );
            chartLinePane.add( createDemoPanel( TypeChart.TIMESERIES ) );
      
            //ChartPanel chartPanel = new ChartPanel(  );
            //chartPanel.setPreferredSize( new java.awt.Dimension( 560 , 367 ) );
  
         }
   
         public static JPanel createDemoPanel( TypeChart type ) {
    
                switch(type) {
    
                  case BAR:
                     JChart.BarChart barChart = new JChart.BarChart();
                     return new ChartPanel( barChart.createChart("바(Bar) 차트", barChart.createDataset() ) );
       
                  case LINE:
                     JChart.LineChart lineChart = new JChart.LineChart();
                     return new ChartPanel( lineChart.createChart("선(Line) 차트", lineChart.createDataset() ) );
      
                 case PIE:
                     JChart.PieChart pieChart = new JChart.PieChart();
                    return new ChartPanel( pieChart.createChart("파이(Pie) 판매량 차트", pieChart.createDataset() ) );
      
                 case TIMESERIES:
                    JChart.TimeSeriesChart timeChart = new JChart.TimeSeriesChart();
                    return new ChartPanel( timeChart.createChart("시계열 차트", timeChart.createDataset() ) );
       
                 default:
                    return null;
       
              } // end of classes
    
         }
  

         public static void main( String[ ] args ) {
    
             window = new Chart_AWT( "차트" ); 
             window.setSize( 800, 600 );    
             RefineryUtilities.centerFrameOnScreen( window );    
             window.setVisible( true ); 
      
          }
 }

 JMain\Chart_AWT.java

 package JChart;

 import java.awt.Font;
 import java.io.File;
 import java.io.IOException;

 import org.jfree.chart.ChartFactory;
 import org.jfree.chart.ChartUtilities;
 import org.jfree.chart.JFreeChart;
 import org.jfree.chart.plot.CategoryPlot;
 import org.jfree.chart.plot.PlotOrientation;
 import org.jfree.data.category.CategoryDataset;
 import org.jfree.data.category.DefaultCategoryDataset;

 

 public class BarChart {

         public JFreeChart createChart( String chartTitle, CategoryDataset categoryDataset ) {
  
                    JFreeChart chart = ChartFactory.createBarChart(
                    chartTitle,          // 차트 제목
                   "Category",        // x축 제목
                   "Score",            // y축 제목
                   categoryDataset,            // 데이터셋
                   PlotOrientation.VERTICAL,           
                   true, true, false);

         

                   // 제목 - 한글
                   chart.getTitle().setFont(new Font("돋움", Font.BOLD, 15));
                   chart.getLegend().setItemFont(new Font("돋움", Font.BOLD, 15));

                   CategoryPlot plot = (CategoryPlot) chart.getPlot();


                   // 범위, 도메인 - 한글        
                  plot.getDomainAxis().setLabelFont(new Font("돋움", Font.PLAIN, 13));
                  plot.getDomainAxis().setTickLabelFont(new Font("돋움", Font.PLAIN, 11));
                  plot.getRangeAxis().setLabelFont(new Font("돋움", Font.PLAIN, 13));
                  plot.getRangeAxis().setTickLabelFont(new Font("돋움", Font.PLAIN, 11));
       
                  int width = 560;    /* Width of the image */          
                  int height = 370;   /* Height of the image */           
        
                  File fileChart = new File( "pie_Chart.jpeg" );
     
                  try {
                        ChartUtilities.saveChartAsJPEG( fileChart, chart, width, height );
                  }
                  catch(IOException e) {
                        System.out.println( e.getMessage() );
                  }
     
                  return chart;
       
          }
 
          public CategoryDataset createDataset( ) {
     
                final String a1 = "A자동차";        
                final String b1 = "B자동차";
                final String c1 = "C자동차";
       
                final String speed = "Speed";
                final String millage = "Millage";
                final String userrating = "User Rating";        
                final String safety = "safety";        
       
                final DefaultCategoryDataset dataset = new DefaultCategoryDataset( );  
 
                dataset.addValue( 1.0 , a1 , speed );        
                dataset.addValue( 3.0 , a1 , userrating );        
                dataset.addValue( 5.0 , a1 , millage ); 
                dataset.addValue( 5.0 , a1 , safety );           
 
                dataset.addValue( 5.0 , b1 , speed );        
                dataset.addValue( 6.0 , b1 , userrating );       
                dataset.addValue( 10.0 , b1 , millage );        
                dataset.addValue( 4.0 , b1 , safety );
 
                dataset.addValue( 4.0 , c1 , speed );        
                dataset.addValue( 2.0 , c1 , userrating );        
                dataset.addValue( 3.0 , c1 , millage );        
                dataset.addValue( 6.0 , c1 , safety );               
 
                return dataset;
        
           }
 
 }

 JChart\BarChart.java

 package JChart;

 import java.awt.Font;

 import org.jfree.chart.ChartFactory;
 import org.jfree.chart.JFreeChart;
 import org.jfree.chart.plot.CategoryPlot;
 import org.jfree.chart.plot.PlotOrientation;
 import org.jfree.data.category.DefaultCategoryDataset;

 

 public class LineChart{
  
       public DefaultCategoryDataset createDataset( ) {
  
              DefaultCategoryDataset dataset = new DefaultCategoryDataset( );
       
              dataset.addValue( 15 , "명" , "1970" );
              dataset.addValue( 30 , "명" , "1980" );
              dataset.addValue( 60 , "명" ,  "1990" );
              dataset.addValue( 120 , "명" , "2009" );
              dataset.addValue( 240 , "명" , "2013" );
              dataset.addValue( 300 , "명" , "2017" );
       
              return dataset;
       
       }

       public JFreeChart createChart( String chartTitle, DefaultCategoryDataset dataset ) {
  
             JFreeChart chart = ChartFactory.createLineChart(
                      chartTitle,    // title - 제목
                     "년도(Years)",   // x축 제목
                     "명",      // y축 제목
                     dataset ,    // 데이터셋
                     PlotOrientation.VERTICAL,
                     true,true,false);
      
             // 제목 - 한글
             chart.getTitle().setFont(new Font("돋움", Font.BOLD, 15));
             chart.getLegend().setItemFont(new Font("돋움", Font.BOLD, 15));

             CategoryPlot plot = (CategoryPlot) chart.getPlot();

             // 범위, 도메인 - 한글        
             plot.getDomainAxis().setLabelFont(new Font("돋움", Font.PLAIN, 13));
             plot.getDomainAxis().setTickLabelFont(new Font("돋움", Font.PLAIN, 11));
             plot.getRangeAxis().setLabelFont(new Font("돋움", Font.PLAIN, 13));
             plot.getRangeAxis().setTickLabelFont(new Font("돋움", Font.PLAIN, 11));
        
             return chart;
        
        }
 
 }

 JChart\LineChart.java

 package JChart;

 import java.awt.Font;

 import org.jfree.chart.ChartFactory;
 import org.jfree.chart.JFreeChart;
 import org.jfree.chart.plot.CategoryPlot;
 import org.jfree.chart.plot.PiePlot;
 import org.jfree.chart.plot.PlotOrientation;
 import org.jfree.data.category.DefaultCategoryDataset;
 import org.jfree.data.general.DefaultPieDataset;
 import org.jfree.data.general.PieDataset;

 

 public class PieChart{
  
      public PieDataset createDataset( ) {
             DefaultPieDataset dataset = new DefaultPieDataset( );
       
             dataset.setValue( "이아 5s" , new Double( 20 ) );  
             dataset.setValue( "송송" , new Double( 20 ) );   
             dataset.setValue( "모터" , new Double( 40 ) );    
             dataset.setValue( "루미아" , new Double( 10 ) );
       
             return dataset;         
       }
 
       public JFreeChart createChart( String charTitle , PieDataset dataset ) {
  
             JFreeChart chart = ChartFactory.createPieChart(      
                               charTitle,     // chart title 
                               dataset,          // data    
                               true,              // include legend   
                               true, false);
       
             chart.getTitle().setFont(new Font("돋움", Font.BOLD, 15));
             chart.getLegend().setItemFont(new Font("돋움", Font.BOLD, 15));

             PiePlot plot = (PiePlot) chart.getPlot();
             plot.setLabelFont(new Font("돋움", Font.PLAIN, 12));
       
             return chart;
       }
 
 }

 JChart\PieChart.java

 package JChart;

 import java.awt.Font;

 import org.jfree.chart.ChartFactory;
 import org.jfree.chart.JFreeChart;
 import org.jfree.chart.plot.CategoryPlot;
 import org.jfree.chart.plot.XYPlot;
 import org.jfree.data.general.SeriesException;
 import org.jfree.data.time.Second;
 import org.jfree.data.time.TimeSeries;
 import org.jfree.data.time.TimeSeriesCollection;
 import org.jfree.data.xy.XYDataset;
 import org.jfree.data.xy.XYSeries;


 public class TimeSeriesChart {

         public XYDataset createDataset( ) {
       
              TimeSeries series = new TimeSeries( "Random Time" );         
              Second current = new Second( );         
              double value = 100.0;         
       
              for (int i = 0; i < 4000; i++) {
          
                   try {
                       value = value + Math.random( ) - 0.5;                 
                       series.add ( current, new Double( value ) );                 
                       current = ( Second ) current.next( ); 
                   } catch ( SeriesException e ) {
                        System.err.println("Error adding to series");
                   }
            }

            return new TimeSeriesCollection(series);
       }    


       public JFreeChart createChart( String chartTItle, final XYDataset dataset ) {
       
             JFreeChart chart = ChartFactory.createTimeSeriesChart(             
                   chartTItle,    // 차트 제목
                   "Seconds",         // x축 제목    
                   "Value",             // y축 제목
                   dataset,            
                   false,             
                   false,             
                   false);
  
             // 제목 - 한글
             chart.getTitle().setFont(new Font("돋움", Font.BOLD, 15));
             //chart.getLegend().setItemFont(new Font("돋움", Font.BOLD, 15));
     
             XYPlot plot = (XYPlot) chart.getPlot();

             // 범위, 도메인 - 한글        
             plot.getDomainAxis().setLabelFont(new Font("돋움", Font.PLAIN, 13));
             plot.getDomainAxis().setTickLabelFont(new Font("돋움", Font.PLAIN, 11));
             plot.getRangeAxis().setLabelFont(new Font("돋움", Font.PLAIN, 13));
             plot.getRangeAxis().setTickLabelFont(new Font("돋움", Font.PLAIN, 11));
       
             return chart;
     
       }

 

 }

 JChart\TimeSeriesChart.java


JavaSwingWithjFreeChart.zip



4. 시연



 


 시연 영상입니다.


JPanel로 구현 하였습니다.




5. 참고 자료

http://www.jfree.org/jfreechart/download.html

http://www.object-refinery.com/orsonpdf/index.html


https://www.tutorialspoint.com/jfreechart/jfreechart_bubble_chart.htm

-> AWT로 GUI를 구현하는 방법 등의 예제들이 소개되어 있습니다.

https://www.caveofprogramming.com/java/charts-in-java-swing-with-jfreechart.html

-> Java Swing으로 구현하는 방법에 대해서 소개하고 있습니다.


http://annotations.tistory.com/67

-> 예제에 적용된 한글 폰트 설정입니다.

http://develop.sunshiny.co.kr/578

-> 소스코드를 컴파일을 해야하는데, 패키지 등 구성요소를 찾아내야 하고 많은 시간이 소요됩니다.

JavaSwingWithjFreeChart.zip
0.04MB
jfreechart-1.0.19.zip
7.68MB
orsonpdf-1.7.zip
2.14MB