2012-01-12 3 views
0

JDBCCategoryDataset 클래스를 사용하여 JFrame 안에 세 개의 차트를 만들고 싶습니다.JDBCCategoryDataset - 여러 쿼리 실행

어떻게 세 가지 별도의 쿼리를 제공 할 수 있습니까? 데이터 집합 개체에서 세 가지 다른 쿼리를 제공했지만 그 결과 세 가지 유사한 차트가 표시되었습니다. 또한 세 가지 모두에 대한 마지막 쿼리를 실행합니다. DefaultPieDataset 주어진 기본 (정적) 값으로 완료되는 방식을 보았지만 데이터베이스에서 동적으로 데이터를 검색하려고합니다.

여러 개의 JDBCCategoryDataset 개체를 만들 수 있습니다. 더 좋은 방법이 있습니까?

package barchart; 

import Extra.OpenFile; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.GridLayout; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.sql.SQLException; 
import javax.swing.JFrame; 
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.PlotOrientation; 
import org.jfree.chart.renderer.category.BarRenderer; 
import org.jfree.data.jdbc.JDBCCategoryDataset; 
import org.jfree.ui.RefineryUtilities; 

public class Chart { 
     public static void main(String[] args) throws IOException { 

      try { 
      JDBCCategoryDataset dataset = new JDBCCategoryDataset(
      "jdbc:mysql://localhost:3306/jobfinder", 
      "com.mysql.jdbc.Driver","giannis", "giannis"); 

      JFrame frame = new JFrame("Charts"); 
      frame.setLayout(new GridLayout(2,1)); 

      String query = ""; 
      query = OpenFile.getContent("query"); //Gets the query from a file 
               // cause it's big.It's a custom class. 
      dataset.executeQuery(query); 
      JFreeChart chart = 
      ChartFactory.createBarChart3D("Job Statistics", "Posts/Replys", "Quantity", 
      dataset, PlotOrientation.VERTICAL, true, true, false); 

      chart.setBackgroundPaint(Color.white); 
      CategoryPlot plot = (CategoryPlot) chart.getPlot(); 
      plot.setBackgroundPaint(Color.lightGray); 
      plot.setRangeGridlinePaint(Color.white); 

      BarRenderer renderer = (BarRenderer) plot.getRenderer(); 
      renderer.setSeriesPaint(1, Color.CYAN); 
      renderer.setSeriesPaint(0, Color.DARK_GRAY); 
      renderer.setDrawBarOutline(false); 
      renderer.setItemMargin(0.0); 

      ChartPanel chartPanel = new ChartPanel(chart, false); 
      chartPanel.setPreferredSize(new Dimension(700, 270)); 

      frame.add(chartPanel); 


//    query = "SELECT occuDscr Jobs,COUNT(pstOccuId) Quantity FROM occupation_field " + 
//      "INNER JOIN job_post ON occuId = pstOccuId GROUP BY Jobs"; 
//    dataset.executeQuery(query); 
//    JFreeChart chart1 = 
//    ChartFactory.createBarChart3D("Job Statistics", "Posts/Replys", "Quantity", 
//    dataset, PlotOrientation.VERTICAL, true, true, false); 
// 
//    ChartPanel chartPanel1 = new ChartPanel(chart1, false); 
//    chartPanel.setPreferredSize(new Dimension(500/2, 270/2)); 
// 
//    frame.add(chartPanel1); 
// 
//    query = "SELECT occuDscr Jobs,COUNT(usrOccuId) Quantity FROM occupation_field " + 
//      "INNER JOIN users ON occuId = usrOccuId GROUP BY Jobs"; 
//    dataset.executeQuery(query); 
//    JFreeChart chart2 = 
//    ChartFactory.createBarChart3D("Job Statistics", "Posts/Replys", "Quantity", 
//    dataset, PlotOrientation.VERTICAL, true, true, false); 
// 
//    ChartPanel chartPanel2 = new ChartPanel(chart2, false); 
//    chartPanel.setPreferredSize(new Dimension(500/2, 270/2)); 
// 
//    frame.add(chartPanel2); 

      frame.setVisible(true); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.pack(); 

      RefineryUtilities.centerFrameOnScreen(frame); 

     } catch (FileNotFoundException fe) { 
      System.out.println("Error Occurred " + fe.getMessage()); 
      System.exit(0); 
     } catch (IOException ie) { 
      System.out.println("Error Occurred " + ie.getMessage()); 
      System.exit(0); 
     } catch (ClassNotFoundException ce) { 
      System.out.println("Error Occurred " + ce.getMessage()); 
      System.exit(0); 
     } catch (SQLException se) { 
      System.out.println("Error Occurred " + se.getMessage()); 
      System.exit(0); 
     } 
    } 
} 

답변

1

개념적으로 가장 간단한 방법은 각 패널에 자체 쿼리 관련 JDBCCategoryDataset을 부여하는 것입니다. 이 관련 example에서 각 패널 ThermometerDemo은 자신의 DefaultValueDataset입니다.

또는 JDBCCategoryDataset 세 개의 클래스를 정의하여 세 개의 CategoryDataset 인스턴스를 작성하는 데 필요한 모든 데이터를 검색하고 각 원형 차트에 필요한 개별 데이터 세트를 반환하는 정적 팩터 리 메소드를 노출하십시오.

부록 : 후자의 접근 방식은 전체 결과 집합의 하위 집합을 구별하는 데 유용한 경험적 방법이 있다고 가정합니다. 예를 들어 인접한 부분 집합에 대한 부분 구현은 다음과 같습니다.

/** @see https://stackoverflow.com/questions/8835974 */ 
public class MyCategoryDataset implements CategoryDataset{ 

    private JDBCCategoryDataset set; 
    private List subList; 

    private MyCategoryDataset(JDBCCategoryDataset set, int first, int last) { 
     this.set = set; 
     subList = set.getRowKeys().subList(first, first); 
    } 

    public static CategoryDataset createSubset(
      JDBCCategoryDataset set, int first, int last) { 
     return new MyCategoryDataset(set, first, first); 
    } 

    @Override 
    public Comparable getRowKey(int row) { 
     return (Comparable) subList.get(row); 
    } 

    @Override 
    public int getRowIndex(Comparable key) { 
     return subList.indexOf(key); 
    } 

    @Override 
    public List getRowKeys() { 
     return subList; 
    } 

    // TODO 
    //@Override 
    //public Comparable getColumnKey(int column) {} 
    // 
    //@Override 
    //public int getColumnIndex(Comparable key) {} 
    // 
    //@Override 
    //public List getColumnKeys() {} 
    // 
    //@Override 
    //public Number getValue(Comparable rowKey, Comparable columnKey) {} 
    // 
    //@Override 
    //public int getRowCount() {} 
    // 
    //@Override 
    //public int getColumnCount() {} 
    // 
    //@Override 
    //public Number getValue(int row, int column) {} 
    // 
    //@Override 
    //public void addChangeListener(DatasetChangeListener listener) {} 
    // 
    //@Override 
    //public void removeChangeListener(DatasetChangeListener listener) {} 
    // 
    //@Override 
    //public DatasetGroup getGroup() {} 
    // 
    //@Override 
    //public void setGroup(DatasetGroup group) {} 
} 
+0

일부 코드 샘플을 사용하여 CategoryDataset 인스턴스를 작성할 수 있습니까? –

+0

위의 개요를 제안하려고했습니다. – trashgod