2012-01-12 59 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實例嗎? – 2012-01-12 22:19:34

+0

我試圖建議上面的大綱。 – trashgod 2012-01-12 23:20:46