Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [JAVA]Aiuto nel creare un grafico con dati presi da database

    Salve,
    Usando JFreeChart vorrei creare un grafico con dei dati presi da un database....

    Sono riuscito a connettermi al database e a stampare i dati a video e sono riuscito a creare un grafico con dei dati già impostati...
    Ora il mio problema è unire le 2 cose, ossia:
    Come faccio a creare un grafico con dei dati presi dal database (in cui una colonna indica il tempo in cui i dati sono stati scritti)???

    Qualcuno può gentilmente aiutarmi???

    GRAZIE!

  2. #2
    Utente di HTML.it L'avatar di ziz
    Registrato dal
    Jun 2008
    Messaggi
    52
    Non potrebbe bastare caricare i dati da database con una query, salvarli in una struttura e caricarli da lì per tracciare il grafico?
    Se ci riesci fammi sapere perchè è una cosa che tra qualche giorno interesserà anche me!
    A presto, ciao!

  3. #3
    A dirsi è facile...è a farsi che è un pò più difficile....
    Questo dovrebbe essere il codice per connettersi al mio database (cambi a seconda del tipo di database che hai, io ho sql server 2005)
    codice:
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.Statement;
    import java.awt.*;
    import java.io.*;
    import java.util.*;
    import org.jfree.*;
    import org.jfree.data.time.TimeSeries;
    import org.jfree.data.time.TimeSeriesCollection;
    public class Select {
     
      public static void main(String args[]) {
       // Indirizzo in cui si trova il database
        String url = "jdbc:jtds:sqlserver://localhost:1433/DbCelle";
        Connection con = null;
     
        try {
         String driver = "net.sourceforge.jtds.jdbc.Driver";
         Class.forName(driver).newInstance();
         } 
        catch (Exception e) {
         System.out.println("Fallito il caricamento dei driver SQL.");
         return;
        }
        try {
         // Query SQL
         String SQL= "SELECT * FROM Cella1";
         // Connessione col database in cui vengono specificati url, nome utente, password
         con = DriverManager.getConnection(url, "****", "****");
         Statement select = con.createStatement();
         //caricamento query SQL
         ResultSet result = select.executeQuery(SQL);
         System.out.println("Risultati:");
            while (result.next()) {
             int id = result.getInt(1);
             String tempo = result.getString(2);
             String temp_a = result.getString(3);
             String temp_p = result.getString(4);
             String temp_s_a = result.getString(5);
             String temp_s_b = result.getString(6);
             String temp_s_m = result.getString(7);
     
             System.out.println("ID = " + id);
             System.out.println("Tempo = " + tempo);
             System.out.println("Temp_Ambiente = " + temp_a);
             System.out.println("Temp_Prodotto = " + temp_p);
             System.out.println("Temp_Set_Alta = " + temp_s_a);
             System.out.println("Temp_Set_Bassa = " + temp_s_b);
             System.out.println("Temp_Set_Media = " + temp_s_m);
             System.out.println("");
                  }
         } 
        catch (Exception e) {
         e.printStackTrace();
             } 
        finally {
         if (con != null) {
            try {
             con.close();
             } 
            catch (Exception e) {
             e.printStackTrace();
             }
          }
        }
      }
    }
    mentre questo è per fare un grafico con punti prefssati.....
    codice:
    import java.io.File;
    import java.io.IOException;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.Random;
    import org.jfree.chart.ChartUtilities;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.axis.DateAxis;
    import org.jfree.chart.axis.DateTickUnit;
    import org.jfree.chart.axis.NumberAxis;
    import org.jfree.chart.plot.XYPlot;
    import org.jfree.chart.renderer.xy.StandardXYItemRenderer;
    import org.jfree.data.time.Day;
    import org.jfree.data.time.TimeSeries;
    import org.jfree.data.time.TimeSeriesCollection;
    import org.jfree.ui.RectangleInsets;
    
    public class Trend {
    public static void main(String[] args) {
    TimeSeriesCollection dataSet =  new TimeSeriesCollection();
    Day day = new Day();
    
    TimeSeries data = new TimeSeries("Trend", day.getClass());
    
    // XXX add real data here
    Random r = new Random();
    Calendar c = Calendar.getInstance();
    for(int i = 0; i < 100; i++) {
    int val = r.nextInt(100);
    if(val < 50)
    val += 50;
    c.add(Calendar.DATE, 7);
    Date date = c.getTime();
    data.add(new Day(date), val);
    }
    dataSet.addSeries(data);
    // The sparkline is created by setting a bunch of the visible properties
    // on the domain, range axis and the XYPlot to false
    
    DateAxis x = new DateAxis();
    x.setTickUnit(new DateTickUnit(DateTickUnit.DAY, 1));
    x.setTickLabelsVisible(true);
    x.setTickMarksVisible(true);
    x.setAxisLineVisible(true);
    x.setNegativeArrowVisible(true);
    x.setPositiveArrowVisible(true);
    x.setVisible(true);
    
    NumberAxis y = new NumberAxis();
    y.setTickLabelsVisible(true);
    y.setTickMarksVisible(true);
    y.setAxisLineVisible(true);
    y.setNegativeArrowVisible(true);
    y.setPositiveArrowVisible(true);
    y.setVisible(true);
    
    XYPlot plot = new XYPlot();
    plot.setInsets(new RectangleInsets(0, 0, 0, 0));
    plot.setDataset(dataSet);
    plot.setDomainAxis(x);
    plot.setDomainGridlinesVisible(true);
    plot.setDomainCrosshairVisible(true);
    plot.setRangeGridlinesVisible(true);
    plot.setRangeCrosshairVisible(true);
    plot.setRangeAxis(y);
    plot.setRenderer(new StandardXYItemRenderer(StandardXYItemRenderer.LINES));
    JFreeChart chart = new JFreeChart(null, JFreeChart.DEFAULT_TITLE_FONT, plot, true);
    chart.setBorderVisible(true);
    try {
    ChartUtilities.saveChartAsJPEG(new File("linea.jpeg"), chart,1400, 900);
    } 
    catch(IOException e) {
    System.err.println("Failed to render chart as png: "+ e.getMessage());
    e.printStackTrace();
    }
    }
    }
    Ora basterebbe che qualcuno mi dia una mano ad unire le due cose ed io sarei a posto ed aiuterei anche tu....

  4. #4
    Utente di HTML.it L'avatar di morphy79
    Registrato dal
    Jun 2004
    Messaggi
    1,568
    inizializzi il grafico come nella seconda parte di codice (senza l'aggiunta dei dati fissi ovviamente) poi fai la tua query e nel punto in cui stampi a video il contenuto delle tue celle, anzichè system.out usi l'istruzione per aggiungere il valore che ti interessa al dataset con il comando dataset.addValue() dove aggiungi 1 singolo valore alla volta
    odio chi parla di politica..
    anzi vorrei fondare un partito contro tutto ciò

  5. #5
    Concettualmente sapevo anch'io come fare, ma non riesco a generare il codice JAVA appropriato per unire le 2 parte del programma....
    o meglio riesco a farlo per uno SOLO dei dati, e non riesco però ad impostare il periodo....
    visto che ho il formato data espresso così
    2008/05/30 16.34.40
    nel database, ossia anno/mese/giorno
    Ah dimenticavo avevo unito la parte della connessione con questa e non con il trend sopra visto che volgio fare un FRAME e non un'immagine salata su disco....
    Comunque non riesco a unire logicamente le 2 parti, riesco a sostituire al massimo value coi valori di una sola delle colonna della tabella, ma period è più difficile da settare......nel caso è un periodo regolare, mentre io vorrei prendere i valori del tempo dal database
    codice:
    import java.awt.Dimension;
    
    import javax.swing.JDesktopPane;
    import javax.swing.JInternalFrame;
    
    import org.jfree.chart.ChartFactory;
    import org.jfree.chart.ChartPanel;
    import org.jfree.chart.JFreeChart;
    import org.jfree.data.time.Minute;
    import org.jfree.data.time.RegularTimePeriod;
    import org.jfree.data.time.TimeSeries;
    import org.jfree.data.time.TimeSeriesCollection;
    import org.jfree.data.xy.XYDataset;
    import org.jfree.ui.ApplicationFrame;
    import org.jfree.ui.RefineryUtilities;
    
    /**
     * A simple internal frame
     * 
     */
    public class InternalFrameDemo extends ApplicationFrame {
    
        /**
         * Creates a new instance.
         * 
         * @param title  the title.
         */
        public InternalFrameDemo(final String title) {
            super(title);
            	 final JDesktopPane desktopPane = new JDesktopPane();
            	 desktopPane.setPreferredSize(new Dimension(800, 600));
            	 final JInternalFrame frame = createFrame();
            	 desktopPane.add(frame);
            	 frame.pack();
            	 frame.setLocation(0, 0);
            	 frame.setVisible(true); 
            	 getContentPane().add(desktopPane);
        }
        
        /**
         * Creates an internal frame.
         * 
         * @return An internal frame.
         */
        private JInternalFrame createFrame() {
            final XYDataset dataset1 = createDataset("Series 1", 100,new Minute());
            
        	final JFreeChart chart = ChartFactory.createTimeSeriesChart("Titolo Trend","Giorno","Temperatura",dataset1,true, true, false);
               
            final ChartPanel chartPanel = new ChartPanel(chart);
            chartPanel.setPreferredSize(new Dimension(800, 600));
            final JInternalFrame frame = new JInternalFrame("Prove Trend", true);
            frame.getContentPane().add(chartPanel);
            return frame;
        }
        
        /**
         * Creates a sample dataset.
         * 
         * @param name  the dataset name.
         * @param base  the starting value.
         * @param start  the starting period.
         *
         * @return The dataset.
         */
        private XYDataset createDataset(final String name,final double base,final RegularTimePeriod start) {
    
            final TimeSeries series = new TimeSeries(name, start.getClass());
            RegularTimePeriod period = start;
            double value = base;
            for (int i = 0; i < 10; i++) {
                series.add(period, value);    
                period = period.next();
                value = value * (1 + (Math.random() - 0.495) / 10.0);
            }
    
            final TimeSeriesCollection dataset = new TimeSeriesCollection();
            dataset.addSeries(series);
    
            return dataset;
        }
    
        public static void main(final String[] args) {
            final InternalFrameDemo demo = new InternalFrameDemo("Trend 1");
            demo.pack();
            RefineryUtilities.centerFrameOnScreen(demo);
            demo.setVisible(true);    
        }
    }

  6. #6
    Qualcuno potrebbe gentilmente darmi una mano a risolvere il mio problema???

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.