2012-01-12 3 views
0

Je souhaite créer trois graphiques dans un JFrame en utilisant la classe JDBCCategoryDataset.JDBCCategoryDataset - exécute plusieurs requêtes

Comment puis-je donner trois requêtes distinctes? J'ai donné trois requêtes différentes dans l'objet ensemble de données, mais le résultat était d'afficher trois cartes similaires. En outre, il exécute la dernière requête pour tous les trois. J'ai vu la façon dont cela est fait avec DefaultPieDataset donné des valeurs (statiques) par défaut, mais je veux récupérer des données dynamiquement à partir de la base de données.

Je sais que je peux créer plusieurs objets JDBCCategoryDataset? Y a-t-il un meilleur moyen?

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); 
     } 
    } 
} 

Répondre

1

Conceptuellement, l'approche la plus simple est de donner à chaque groupe sa propre JDBCCategoryDataset spécifique à la requête. Dans ce example, chaque panneau ThermometerDemo a son propre DefaultValueDataset.

Vous pouvez également définir une classe ayant un seul JDBCCategoryDataset qui récupère toutes les données requises pour composer trois instances CategoryDataset et exposer des méthodes usine statiques renvoyant chacune l'ensemble de données individuel requis pour chaque diagramme à secteurs.

Addendum: Cette dernière approche suppose qu'il existe une heuristique utile pour distinguer les sous-ensembles de l'ensemble de résultats complet. Par exemple, voici une implémentation partielle pour les sous-ensembles contigus:

/** @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

Pouvez-vous m'aider à composer une instance CategoryDataset avec un échantillon de code. –

+0

J'ai essayé de suggérer un contour ci-dessus. – trashgod