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

    Grafico Real Time Jfreechart...come inserire scroll?

    Ciao Ragazzi!
    Sono nuovo e novellino...
    ho realizzato un grafico real time con Jfreechart, guardando un esempio della Developer Guide.
    Tale grafico rappresenta solo un intervallo di un'eventuale misurazione di eventi.(I dati presi sono casuali)
    Qualora volessi fermarlo, senza rimpiazzare istanti di campionamento, inserendo uno scroll che mi permette di vedere il tutto, come dovrei fare?
    Spero che qualcuno mi aiuti.
    Posto il codice, in maniera che possiate vedere e darmi suggerimenti su quanto ho realizzato:

    import java.awt.BasicStroke;
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.awt.Frame;

    import javax.swing.BorderFactory;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.Timer;

    import org.jfree.chart.ChartPanel;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.axis.DateAxis;
    import org.jfree.chart.axis.NumberAxis;
    import org.jfree.chart.plot.XYPlot;
    import org.jfree.chart.renderer.xy.XYItemRenderer;
    import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer ;
    import org.jfree.data.time.Millisecond;
    import org.jfree.data.time.TimeSeries;
    import org.jfree.data.time.TimeSeriesCollection;
    import org.jfree.ui.RectangleInsets;



    public class RealTimeChart extends JPanel{
    /**Dati temporali da rappresentare*/
    private TimeSeries variabile;

    /**Metodo costruttore
    *
    * @param maxAge durata max visualizzazione dato
    */
    public RealTimeChart(int maxAge, String nomeVar, String grandezza){
    super(new BorderLayout());
    //Creazione serie dati che verranno rimpiazzati dopo maxAge
    this.variabile=new TimeSeries(nomeVar,Millisecond.class);
    this.variabile.setMaximumItemAge(maxAge);
    //Creazione dataset da analizzare
    TimeSeriesCollection dataset=new TimeSeriesCollection();
    dataset.addSeries(this.variabile);

    //Costruzione grafico da realizzare(dominio e variabile misurata)
    DateAxis dominio=new DateAxis("Tempo");
    NumberAxis valori=new NumberAxis(grandezza);
    dominio.setTickLabelFont(new Font("SansSerif", Font.PLAIN, 12));//scelta font scrittura
    valori.setTickLabelFont(new Font("SansSerif", Font.PLAIN, 12));
    XYItemRenderer renderer = new XYLineAndShapeRenderer(true, false);//linee visibili, punti no
    renderer.setSeriesPaint(0, Color.blue);//colore della funzione
    renderer.setStroke(new BasicStroke(1f, BasicStroke.CAP_BUTT,//Larghezza e finitura tratto
    BasicStroke.JOIN_BEVEL));
    XYPlot plot = new XYPlot(dataset, dominio, valori, renderer);//Disegno del grafico
    //colori del grafico
    plot.setBackgroundPaint(Color.lightGray);
    plot.setDomainGridlinePaint(Color.white);
    plot.setRangeGridlinePaint(Color.white);
    plot.setAxisOffset(new RectangleInsets(5.0, 5.0, 5.0, 5.0));
    dominio.setAutoRange(true);
    dominio.setLowerMargin(0.0);
    dominio.setUpperMargin(0.0);
    dominio.setTickLabelsVisible(true);
    valori.setStandardTickUnits(NumberAxis.createInteg erTickUnits());
    //grafico
    JFreeChart chart = new JFreeChart(grandezza,
    new Font("SansSerif", Font.BOLD, 24), plot, true);
    chart.setBackgroundPaint(Color.white);
    ChartPanel chartPanel = new ChartPanel(chart);
    chartPanel.setBorder(BorderFactory.createCompoundB order(
    BorderFactory.createEmptyBorder(4, 4, 4, 4),
    BorderFactory.createLineBorder(Color.black)));
    add(chartPanel);
    }


    /**Metodo che aggiunge un campione all'osservazione in atto
    *
    * @param val valore della variabile esaminata
    */
    private void aggiungiValore(float val){
    this.variabile.add(new Millisecond(), val);
    }

    /**Generatore di dati(crea eventi in determinati intervalli di tempo)
    *
    */
    class GeneratoreDati extends Timer implements ActionListener{
    /**Costruttore
    *
    * @param intervallo cadenza arrivo dati, in millisecondi
    */
    GeneratoreDati(int intervallo){
    super(intervallo,null);
    addActionListener(this);
    }

    /**Aggiunta di un nuovo campione alla misurazione
    * @param event evento che viene invocato
    */
    public void actionPerformed(ActionEvent event){
    float val=(float)(Math.random()*10000);
    aggiungiValore(val);
    }

    }

    public static void main(String[] args){
    JFrame frame=new JFrame("Rappresentazione");
    RealTimeChart panel = new RealTimeChart(60000, "Grandezza", "Misura");
    frame.getContentPane().add(panel, BorderLayout.CENTER);//posizionamento grafico
    frame.setBounds(200, 120, 600, 280);
    frame.setVisible(true);
    panel.new GeneratoreDati(1000).start();//genera dati ogni secondo
    frame.addWindowListener(new WindowAdapter() {
    public void windowClosing(WindowEvent e) {
    System.exit(0);
    }

    });
    }
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013

    Re: Grafico Real Time Jfreechart...come inserire scroll?

    Usa i tag CODE...

    codice:
    import java.awt.BasicStroke;
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.awt.Frame;
    
    import javax.swing.BorderFactory;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.Timer;
    
    import org.jfree.chart.ChartPanel;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.axis.DateAxis;
    import org.jfree.chart.axis.NumberAxis;
    import org.jfree.chart.plot.XYPlot;
    import org.jfree.chart.renderer.xy.XYItemRenderer;
    import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
    import org.jfree.data.time.Millisecond;
    import org.jfree.data.time.TimeSeries;
    import org.jfree.data.time.TimeSeriesCollection;
    import org.jfree.ui.RectangleInsets;
    
    
    
    public class RealTimeChart extends JPanel{
    	/**Dati temporali da rappresentare*/
    	private TimeSeries variabile;
    	
    	/**Metodo costruttore
    	 * 
    	 * @param maxAge durata max visualizzazione dato
    	 */
    	public RealTimeChart(int maxAge, String nomeVar, String grandezza){
    		super(new BorderLayout());
    		//Creazione serie dati che verranno rimpiazzati dopo maxAge
    		this.variabile=new TimeSeries(nomeVar,Millisecond.class);
    		this.variabile.setMaximumItemAge(maxAge);
    		//Creazione dataset da analizzare
    		TimeSeriesCollection dataset=new TimeSeriesCollection();
    		dataset.addSeries(this.variabile);
    		
    		//Costruzione grafico da realizzare(dominio e variabile misurata)
    		DateAxis dominio=new DateAxis("Tempo");
    		NumberAxis valori=new NumberAxis(grandezza);
    		dominio.setTickLabelFont(new Font("SansSerif", Font.PLAIN, 12));//scelta font scrittura
    		valori.setTickLabelFont(new Font("SansSerif", Font.PLAIN, 12));
    		XYItemRenderer renderer = new XYLineAndShapeRenderer(true, false);//linee visibili, punti no
    		renderer.setSeriesPaint(0, Color.blue);//colore della funzione
    		renderer.setStroke(new BasicStroke(1f, BasicStroke.CAP_BUTT,//Larghezza e finitura tratto
    				BasicStroke.JOIN_BEVEL));
    		XYPlot plot = new XYPlot(dataset, dominio, valori, renderer);//Disegno del grafico
    		//colori del grafico
    		plot.setBackgroundPaint(Color.lightGray);
    		plot.setDomainGridlinePaint(Color.white);
    		plot.setRangeGridlinePaint(Color.white);
    		plot.setAxisOffset(new RectangleInsets(5.0, 5.0, 5.0, 5.0));
    		dominio.setAutoRange(true);
    		dominio.setLowerMargin(0.0);
    		dominio.setUpperMargin(0.0);
    		dominio.setTickLabelsVisible(true);
    		valori.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
    		//grafico
    		JFreeChart chart = new JFreeChart(grandezza,
    				new Font("SansSerif", Font.BOLD, 24), plot, true);
    				chart.setBackgroundPaint(Color.white);
    				ChartPanel chartPanel = new ChartPanel(chart);
    				chartPanel.setBorder(BorderFactory.createCompoundBorder(
    				BorderFactory.createEmptyBorder(4, 4, 4, 4),
    				BorderFactory.createLineBorder(Color.black)));
    				add(chartPanel);
    	}
    	
    	
    	/**Metodo che aggiunge un campione all'osservazione in atto
    	 * 
    	 * @param val valore della variabile esaminata
    	 */
    	private void aggiungiValore(float val){
    		this.variabile.add(new Millisecond(), val);
    	}
    	
    	/**Generatore di dati(crea eventi in determinati intervalli di tempo)
    	 * 
    	 */
    	class GeneratoreDati extends Timer implements ActionListener{
    		/**Costruttore
    		 * 
    		 * @param intervallo cadenza arrivo dati, in millisecondi
    		 */
    		GeneratoreDati(int intervallo){
    			super(intervallo,null);
    			addActionListener(this);
    		}
    		
    		/**Aggiunta di un nuovo campione alla misurazione
    		 * @param event evento che viene invocato
    		 */
    		public void actionPerformed(ActionEvent event){
    			float val=(float)(Math.random()*10000);
    			aggiungiValore(val);
    		}
    		
    	}
    	
    	public static void main(String[] args){
    		JFrame frame=new JFrame("Rappresentazione");
    		RealTimeChart panel = new RealTimeChart(60000, "Grandezza", "Misura");
    		frame.getContentPane().add(panel, BorderLayout.CENTER);//posizionamento grafico
    		frame.setBounds(200, 120, 600, 280);
    		frame.setVisible(true);
    		panel.new GeneratoreDati(1000).start();//genera dati ogni secondo
    		frame.addWindowListener(new WindowAdapter() {
    		public void windowClosing(WindowEvent e) {
    		System.exit(0);
    	}
    
    });
    	}
    }
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    poi, non conosco JFreeChart quasi per nulla, ma comincerei con il togliere il

    codice:
    setMaximumItemAge
    e nel main, invece di aggiungere panel direttamente al JFrame, lo infilerei un un JScrollPane e questo nel JFrame
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  4. #4
    Ti ringrazio andrea1979.
    Ho modificato così:

    codice:
    import java.awt.BasicStroke;
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.awt.Frame;
    
    import javax.swing.BorderFactory;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.Timer;
    
    import org.jfree.chart.ChartPanel;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.axis.DateAxis;
    import org.jfree.chart.axis.NumberAxis;
    import org.jfree.chart.plot.XYPlot;
    import org.jfree.chart.renderer.xy.XYItemRenderer;
    import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
    import org.jfree.data.time.Millisecond;
    import org.jfree.data.time.TimeSeries;
    import org.jfree.data.time.TimeSeriesCollection;
    import org.jfree.ui.RectangleInsets;
    
    
    
    public class RealTimeChart extends JPanel{
    	/**Dati temporali da rappresentare*/
    	private TimeSeries variabile;
    	
    	/**Metodo costruttore*/
    	 
    	public RealTimeChart( String nomeVar, String grandezza){
    		super(new BorderLayout());
    		//Creazione serie dati che verranno rimpiazzati dopo maxAge
    		this.variabile=new TimeSeries(nomeVar,Millisecond.class);
    		
    		//Creazione dataset da analizzare
    		TimeSeriesCollection dataset=new TimeSeriesCollection();
    		dataset.addSeries(this.variabile);
    		
    		//Costruzione grafico da realizzare(dominio e variabile misurata)
    		DateAxis dominio=new DateAxis("Tempo");
    		NumberAxis valori=new NumberAxis(grandezza);
    		dominio.setTickLabelFont(new Font("SansSerif", Font.PLAIN, 12));//scelta font scrittura
    		valori.setTickLabelFont(new Font("SansSerif", Font.PLAIN, 12));
    		XYItemRenderer renderer = new XYLineAndShapeRenderer(true, false);//linee visibili, punti no
    		renderer.setSeriesPaint(0, Color.blue);//colore della funzione
    		renderer.setStroke(new BasicStroke(1f, BasicStroke.CAP_BUTT,//Larghezza e finitura tratto
    				BasicStroke.JOIN_BEVEL));
    		XYPlot plot = new XYPlot(dataset, dominio, valori, renderer);//Disegno del grafico
    		//colori del grafico
    		plot.setBackgroundPaint(Color.lightGray);
    		plot.setDomainGridlinePaint(Color.white);
    		plot.setRangeGridlinePaint(Color.white);
    		plot.setAxisOffset(new RectangleInsets(5.0, 5.0, 5.0, 5.0));
    		dominio.setAutoRange(true);
    		dominio.setLowerMargin(0.0);
    		dominio.setUpperMargin(0.0);
    		dominio.setTickLabelsVisible(true);
    		valori.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
    		//grafico
    		JFreeChart chart = new JFreeChart(grandezza,
    				new Font("SansSerif", Font.BOLD, 24), plot, true);
    				chart.setBackgroundPaint(Color.white);
    				ChartPanel chartPanel = new ChartPanel(chart);
    				chartPanel.setBorder(BorderFactory.createCompoundBorder(
    				BorderFactory.createEmptyBorder(4, 4, 4, 4),
    				BorderFactory.createLineBorder(Color.black)));
    				add(chartPanel);
    	}
    	
    	
    	/**Metodo che aggiunge un campione all'osservazione in atto
    	 * 
    	 * @param val valore della variabile esaminata
    	 */
    	private void aggiungiValore(float val){
    		this.variabile.add(new Millisecond(), val);
    	}
    	
    	/**Generatore di dati(crea eventi in determinati intervalli di tempo)
    	 * 
    	 */
    	class GeneratoreDati extends Timer implements ActionListener{
    		/**Costruttore
    		 * 
    		 * @param intervallo cadenza arrivo dati, in millisecondi
    		 */
    		GeneratoreDati(int intervallo){
    			super(intervallo,null);
    			addActionListener(this);
    		}
    		
    		/**Aggiunta di un nuovo campione alla misurazione
    		 * @param event evento che viene invocato
    		 */
    		public void actionPerformed(ActionEvent event){
    			float val=(float)(Math.random()*10000);
    			aggiungiValore(val);
    		}
    		
    	}
    	
    	public static void main(String[] args){
    		JFrame frame=new JFrame("Rappresentazione");
    		JScrollPane scroll=new JScrollPane();
    		RealTimeChart panel = new RealTimeChart( "Grandezza", "Misura");
    		scroll.add(panel);
    		frame.getContentPane().add(scroll, BorderLayout.CENTER);//posizionamento grafico
    		frame.setBounds(200, 120, 600, 280);
    		frame.setVisible(true);
    		panel.new GeneratoreDati(1000).start();//genera dati ogni secondo
    		frame.addWindowListener(new WindowAdapter() {
    		public void windowClosing(WindowEvent e) {
    		System.exit(0);
    	}
    
    });
    	}
    }
    Mi fa mettere in evidenza parti di grafico.
    Continua,però, a cancellare i dati precedenti dopo un po'.
    Io vorrei tenere tutto l'intervallo di visualizzazione(da avvio fino a chiusura finestra), magari potendo scorrere il grafico avanti ed indietro nel tempo(senza disegnare 10000 valori in 2 cm di grafico)...che strumento posso usare e come?

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Senza stravolgere troppo il tuo primo codice:
    codice:
    public class RealTimeChart extends JPanel{
    	/**Dati temporali da rappresentare*/
    	private TimeSeries variabile;
            private int numVal = 0;
            private JScrollPane scrollpane;
    
    	/**Metodo costruttore
    	 *
    	 * @param maxAge durata max visualizzazione dato
    	 */
    
            public void setScrollPanel(JScrollPane scrollpane) {
                this.scrollpane = scrollpane;
                scrollpane.getHorizontalScrollBar().addAdjustmentListener(new AdjustmentListener() {
                    public void adjustmentValueChanged(AdjustmentEvent e) {
                        e.getAdjustable().setValue(e.getAdjustable().getMaximum());
                    }});
            }
    
    	public RealTimeChart(int maxAge, String nomeVar, String grandezza){
    		super(new BorderLayout());
    		//Creazione serie dati che verranno rimpiazzati dopo maxAge
    		this.variabile=new TimeSeries(nomeVar,Millisecond.class);
    		//this.variabile.setMaximumItemAge(maxAge);
    		//Creazione dataset da analizzare
    		TimeSeriesCollection dataset=new TimeSeriesCollection();
    		dataset.addSeries(this.variabile);
    
    		//Costruzione grafico da realizzare(dominio e variabile misurata)
    		DateAxis dominio=new DateAxis("Tempo");
    		NumberAxis valori=new NumberAxis(grandezza);
    		dominio.setTickLabelFont(new Font("SansSerif", Font.PLAIN, 12));//scelta font scrittura
    		valori.setTickLabelFont(new Font("SansSerif", Font.PLAIN, 12));
    		XYItemRenderer renderer = new XYLineAndShapeRenderer(true, false);//linee visibili, punti no
    		renderer.setSeriesPaint(0, Color.blue);//colore della funzione
    		renderer.setStroke(new BasicStroke(1f, BasicStroke.CAP_BUTT,//Larghezza e finitura tratto
    				BasicStroke.JOIN_BEVEL));
    		XYPlot plot = new XYPlot(dataset, dominio, valori, renderer);//Disegno del grafico
    		//colori del grafico
    		plot.setBackgroundPaint(Color.lightGray);
    		plot.setDomainGridlinePaint(Color.white);
    		plot.setRangeGridlinePaint(Color.white);
    		plot.setAxisOffset(new RectangleInsets(5.0, 5.0, 5.0, 5.0));
    		dominio.setAutoRange(true);
    		dominio.setLowerMargin(0.0);
    		dominio.setUpperMargin(0.0);
    		dominio.setTickLabelsVisible(true);
    		valori.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
    		//grafico
    		JFreeChart chart = new JFreeChart(grandezza,
    				new Font("SansSerif", Font.BOLD, 24), plot, true);
    				chart.setBackgroundPaint(Color.white);
    				ChartPanel chartPanel = new ChartPanel(chart);
    				chartPanel.setBorder(BorderFactory.createCompoundBorder(
    				BorderFactory.createEmptyBorder(4, 4, 4, 4),
    				BorderFactory.createLineBorder(Color.black)));
    				add(chartPanel);
    	}
    
    
    	/**Metodo che aggiunge un campione all'osservazione in atto
    	 *
    	 * @param val valore della variabile esaminata
    	 */
    	private void aggiungiValore(float val){
    		this.variabile.add(new Millisecond(), val);
                    numVal++;                
                    if (numVal > 5) {
    //se più di 5 campioni, aumenta la larghezza di 10 pixel
                        this.setSize(new Dimension((int)this.getSize().getWidth()+10, (int)this.getSize().getHeight()));
                        this.setPreferredSize(new Dimension((int)this.getSize().getWidth(), (int)this.getSize().getHeight()));                    
                    }
    	}
    
    	/**Generatore di dati(crea eventi in determinati intervalli di tempo)
    	 *
    	 */
    	class GeneratoreDati extends Timer implements ActionListener{
    		/**Costruttore
    		 *
    		 * @param intervallo cadenza arrivo dati, in millisecondi
    		 */
    		GeneratoreDati(int intervallo){
    			super(intervallo,null);
    			addActionListener(this);
    		}
    
    		/**Aggiunta di un nuovo campione alla misurazione
    		 * @param event evento che viene invocato
    		 */
    		public void actionPerformed(ActionEvent event){
    			float val=(float)(Math.random()*10000);
    			aggiungiValore(val);
    		}
    
    	}
    
    	public static void main(String[] args){
    		JFrame frame=new JFrame("Rappresentazione");
    		RealTimeChart panel = new RealTimeChart(60000, "Grandezza", "Misura");
                    JScrollPane scroll = new JScrollPane();
                    panel.setScrollPanel(scroll);
                    scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
                    scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
                    scroll.getViewport().add(panel);                
    		frame.getContentPane().add(scroll, BorderLayout.CENTER);//posizionamento grafico
    		frame.setSize(700,500);
    		frame.setVisible(true);
    		panel.new GeneratoreDati(1000).start();//genera dati ogni secondo
    		frame.addWindowListener(new WindowAdapter() {
                        public void windowClosing(WindowEvent e) {
                            System.exit(0);
                        }
    
                    });
            }
    }
    ovviamente è solo una prova.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  6. #6
    Non mi trova la main class....perché....non riesco a capire...

    Questo è l'errore:
    codice:
    java.lang.NoClassDefFoundError: RealTimeChartProva
    Caused by: java.lang.ClassNotFoundException: RealTimeChartProva
    	at java.net.URLClassLoader$1.run(Unknown Source)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.net.URLClassLoader.findClass(Unknown Source)
    	at java.lang.ClassLoader.loadClass(Unknown Source)
    	at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    	at java.lang.ClassLoader.loadClass(Unknown Source)
    	at java.lang.ClassLoader.loadClassInternal(Unknown Source)
    Exception in thread "main"
    Ho rinominato la tua classe in RealTimeChartProva ma non me la fa partire, pur non trovando errori di alcun tipo:

    codice:
    import java.awt.BasicStroke;
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Font;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.AdjustmentEvent;
    import java.awt.event.AdjustmentListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.awt.Frame;
    
    import javax.swing.BorderFactory;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.Timer;
    
    import org.jfree.chart.ChartPanel;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.axis.DateAxis;
    import org.jfree.chart.axis.NumberAxis;
    import org.jfree.chart.plot.XYPlot;
    import org.jfree.chart.renderer.xy.XYItemRenderer;
    import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
    import org.jfree.data.time.Millisecond;
    import org.jfree.data.time.TimeSeries;
    import org.jfree.data.time.TimeSeriesCollection;
    import org.jfree.ui.RectangleInsets;
    
    public class RealTimeChartProva extends JPanel{
    	/**Dati temporali da rappresentare*/
    	private TimeSeries variabile;
            private int numVal = 0;
            private JScrollPane scrollpane;
    
    	/**Metodo costruttore
    	 *
    	 * @param maxAge durata max visualizzazione dato
    	 */
            
            public void setScrollPanel(JScrollPane scrollpane) {
                this.scrollpane = scrollpane;
                scrollpane.getHorizontalScrollBar().addAdjustmentListener(new AdjustmentListener() {
                    public void adjustmentValueChanged(AdjustmentEvent e) {
                        e.getAdjustable().setValue(e.getAdjustable().getMaximum());
                    }});
            }
    
            
    	public RealTimeChartProva(int maxAge, String nomeVar, String grandezza){
    		super(new BorderLayout());
    		//Creazione serie dati che verranno rimpiazzati dopo maxAge
    		this.variabile=new TimeSeries(nomeVar,Millisecond.class);
    		//this.variabile.setMaximumItemAge(maxAge);
    		//Creazione dataset da analizzare
    		TimeSeriesCollection dataset=new TimeSeriesCollection();
    		dataset.addSeries(this.variabile);
    
    		
    		//Costruzione grafico da realizzare(dominio e variabile misurata)
    		DateAxis dominio=new DateAxis("Tempo");
    		NumberAxis valori=new NumberAxis(grandezza);
    		dominio.setTickLabelFont(new Font("SansSerif", Font.PLAIN, 12));//scelta font scrittura
    		valori.setTickLabelFont(new Font("SansSerif", Font.PLAIN, 12));
    		XYItemRenderer renderer = new XYLineAndShapeRenderer(true, false);//linee visibili, punti no
    		renderer.setSeriesPaint(0, Color.blue);//colore della funzione
    		renderer.setStroke(new BasicStroke(1f, BasicStroke.CAP_BUTT,//Larghezza e finitura tratto
    				BasicStroke.JOIN_BEVEL));
    		XYPlot plot = new XYPlot(dataset, dominio, valori, renderer);//Disegno del grafico
    		//colori del grafico
    		plot.setBackgroundPaint(Color.lightGray);
    		plot.setDomainGridlinePaint(Color.white);
    		plot.setRangeGridlinePaint(Color.white);
    		plot.setAxisOffset(new RectangleInsets(5.0, 5.0, 5.0, 5.0));
    		dominio.setAutoRange(true);
    		dominio.setLowerMargin(0.0);
    		dominio.setUpperMargin(0.0);
    		dominio.setTickLabelsVisible(true);
    		valori.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
    		//grafico
    		JFreeChart chart = new JFreeChart(grandezza,
    				new Font("SansSerif", Font.BOLD, 24), plot, true);
    				chart.setBackgroundPaint(Color.white);
    				ChartPanel chartPanel = new ChartPanel(chart);
    				chartPanel.setBorder(BorderFactory.createCompoundBorder(
    				BorderFactory.createEmptyBorder(4, 4, 4, 4),
    				BorderFactory.createLineBorder(Color.black)));
    				add(chartPanel);
    	}
    
    
    	/**Metodo che aggiunge un campione all'osservazione in atto
    	 *
    	 * @param val valore della variabile esaminata
    	 */
    	private void aggiungiValore(float val){
    		this.variabile.add(new Millisecond(), val);
                    numVal++;                
                    if (numVal > 5) {
    //se più di 5 campioni, aumenta la larghezza di 10 pixel
                        this.setSize(new Dimension((int)this.getSize().getWidth()+10, (int)this.getSize().getHeight()));
                        this.setPreferredSize(new Dimension((int)this.getSize().getWidth(), (int)this.getSize().getHeight()));                    
                    }
    	}
    
    	/**Generatore di dati(crea eventi in determinati intervalli di tempo)
    	 *
    	 */
    	class GeneratoreDati extends Timer implements ActionListener{
    		/**Costruttore
    		 *
    		 * @param intervallo cadenza arrivo dati, in millisecondi
    		 */
    		GeneratoreDati(int intervallo){
    			super(intervallo,null);
    			addActionListener(this);
    		}
    
    		/**Aggiunta di un nuovo campione alla misurazione
    		 * @param event evento che viene invocato
    		 */
    		public void actionPerformed(ActionEvent event){
    			float val=(float)(Math.random()*10000);
    			aggiungiValore(val);
    		}
    
    	}
    
    	public static void main(String[] args){
    		JFrame frame=new JFrame("Rappresentazione");
    		RealTimeChartProva panel = new RealTimeChartProva(60000, "Grandezza", "Misura");
                    JScrollPane scroll = new JScrollPane();
                    panel.setScrollPanel(scroll);
                    scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
                    scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
                    scroll.getViewport().add(panel);                
    		frame.getContentPane().add(scroll, BorderLayout.CENTER);//posizionamento grafico
    		frame.setSize(700,500);
    		frame.setVisible(true);
    		panel.new GeneratoreDati(1000).start();//genera dati ogni secondo
    		frame.addWindowListener(new WindowAdapter() {
                        public void windowClosing(WindowEvent e) {
                            System.exit(0);
                        }
    
                    });
            }
    }
    Mi sembra una buona strada quella che hai suggerito, solo che non me la fa partire

  7. #7
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Stai usando un qualche IDE (netbeans, eclipse o altro)? Se sì, fai un "clean & rebuild" del progetto. Altrimenti, sbarazzati di tutti i file .class a manina e ricompila. Il tuo/mio codice compila ed esegue tranquillamente da me.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  8. #8
    Fatto e compila!
    Sto usando eclipse helios 3.6
    Non riuscivo a capire cosa ci fosse che non va....
    Ti ringrazio tantissimo, andrea1979...grazie per la pazienza e le risposte.
    A presto

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 © 2026 vBulletin Solutions, Inc. All rights reserved.