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

    [java] disegnare un grafico

    ciao a tutti

    vorrei fare un'applicazione molto semplice che prende in ingresso un vettore di interi e ne disegna un grafico a barre in una finestra, come ambiente di sviluppo utilizzo jbuilder X foundation, sapreste consigliarmi come fare? ci sono già delle classi che mi permettono di disegnare dei rettangoli (magari specificando i pixel) su un'area specifica della finestra? o avete altre idee?

    grazie nik
    "durante i primi 5 miuti di pioggia nel bosco c'è ancora asciutto, poi quando smetterà di piovere nel bosco cadranno gocce per 5 minuti.....la natura ha un'ottima memoria..."

    http://www.kumbe.it

  2. #2
    Utente di HTML.it L'avatar di Xadoom
    Registrato dal
    Dec 2002
    Messaggi
    1,491
    Puoi sovrascrivere il metodo paint(Graphic g) di un JPanel e utilizzare all'interno di esso l'oggetto Graphic per disegnare tutte le forme che vuoi....dà un'okkiata alle API:
    http://java.sun.com/j2se/1.5.0/docs/api/
    Windows Xp
    [Java]
    [PHP]Notepad++
    [Fortran90-77] elf90 g77
    [C++ /WinAPI] DevC++ VisualC++

  3. #3
    hi provato a dare un'occhiata ma non ci ho capito molto!

    sapresti dirmi dove posso trovare un po di documentazione on line? o esempi di codice?
    "durante i primi 5 miuti di pioggia nel bosco c'è ancora asciutto, poi quando smetterà di piovere nel bosco cadranno gocce per 5 minuti.....la natura ha un'ottima memoria..."

    http://www.kumbe.it

  4. #4
    Utente di HTML.it L'avatar di Xadoom
    Registrato dal
    Dec 2002
    Messaggi
    1,491
    C'è molto materiale sul sito Sun, ora non ho tempo per cercare bene, sicuto c'è qualche tutorial....ora ho trovato questo:
    http://java.sun.com/developer/Books/Graphics/
    Windows Xp
    [Java]
    [PHP]Notepad++
    [Fortran90-77] elf90 g77
    [C++ /WinAPI] DevC++ VisualC++

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Se vuoi ho abbozzato una semplicissima classe, abbastanza incompleta e decisamente migliorabile:
    codice:
    import java.awt.*;
    import javax.swing.*;
    
    public class Grafico extends JPanel {
       private int [] valori;
       private int [] valNorm;
       private int max;
       private int valMax;
       private boolean drawChart;
    
       public Grafico() { this( new int[0] ); }
       public Grafico(int [] valori) {
          this.valori = valori;
          valNorm = new int[valori.length];
          drawChart = false;
          cercaMax();
       }
    
       public void setValori(int [] valori) {
          this.valori = valori;
          valNorm = new int[valori.length];
          cercaMax();
          normalizza();
       }
       public void disegna() {drawChart = true; repaint(); }
    
       public void paint(Graphics g) {
          if (drawChart) {
             for (int i=0; i<valori.length; i++) {
                g.fillRect((i*20 + 10), (valMax - valNorm[i])+10 , 10, getHeight());
             }
             g.drawRect(0, 0, getWidth()-1, getHeight()-1);
          }
       }
    
       private void cercaMax() {
          for (int i=0; i<valori.length; i++) max = (valori[i] > max) ? valori[i] : max;
       }
    
       private void normalizza() {
          int altezza = getHeight()-10;
          for (int i=0; i<valori.length; i++) {
             valNorm[i] = (altezza * valori[i]) / max;
             if (valori[i] == max) valMax = valNorm[i];
             System.out.println(valNorm[i]);
          }
       }
    }
    Questa classe la puoi usare all'interno del tuo progetto, nel modo seguente:
    codice:
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    
    public class Finestra extends JFrame {
       private Grafico g;
    
       public Finestra() {
          getContentPane().setLayout(null);
          setTitle("Titolo");
          setSize(800, 600);
          setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          show();
       }
    
       public void visualizza() {
          g = new Grafico();
          int [] valori = {10, 7, 12, 20, 18, 6, 15, 7, 25, 50, 5, 32, 8, 7, 7, 7, 34};
          g.setBounds(50, 50, 500, 500);
          getContentPane().add(g);
          g.setValori(valori);
          g.disegna();
       }
    
       public static void main(String [] args) {
          Finestra f = new Finestra();
          f.visualizza();
       }
    }
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    ciao!

    ho provato il tuo grafico ed è una figata! inoltre è molto semplice da utilizzare!! grande!!

    cercando in internet ho trovato questo sito:

    http://www.jfree.org/jfreechart/

    che ha veramente un sacco di esempi di classi già fatte (scaricatevelo ! sono veramente fatti bene!)

    ho provato a aprire una di quelle classi ma il problema è che non mi trova tutti gli import che fa dei suoi package, ad esempio:

    codice:
    import junit.framework.Test;
    import junit.framework.TestCase;
    import junit.framework.TestSuite;
    
    import org.jfree.chart.axis.Axis;
    import org.jfree.chart.axis.CategoryAxis;
    ad esempio tutti questi import generano errori in quanto le classi non vengono trovate...secondo voi a cosa è dovuto? devo "installare" le classi di jfreechart? devo copiare i file .java in qualche directory di JBuilder?

    che posso fare?grazie
    "durante i primi 5 miuti di pioggia nel bosco c'è ancora asciutto, poi quando smetterà di piovere nel bosco cadranno gocce per 5 minuti.....la natura ha un'ottima memoria..."

    http://www.kumbe.it

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Ciao.
    Semplicemente quelle classi fanno uso di altre classi contenute in package "proprietari", nel senso che chi ha sviluppato quelle classi si è creato dei propri package. Ciò che puoi fare è solo scaricare i package necessari per l'utilizzo di tali classi, che sicuramente verranno forniti da chi ha prodotto tali classi.

    Che la cosa sia gratuita, poi, è un altro paio di maniche!


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  8. #8
    ciao!

    anche i package sono free!! sono riuscito a scaricarli e installarli..ora però mi succede una cosa stranissima:

    ho utilizzato una classe

    DynamicDataDemo

    che aggiungendo dei valori con una funzione aggiorna in tempo reale il grafico questo è il codice della classe

    codice:
    package a_ApplicationLayer;
    
    import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.JButton;
    import javax.swing.JPanel;
    
    import org.jfree.chart.ChartFactory;
    import org.jfree.chart.ChartPanel;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.axis.ValueAxis;
    import org.jfree.chart.plot.XYPlot;
    import org.jfree.data.XYDataset;
    import org.jfree.data.time.Millisecond;
    import org.jfree.data.time.TimeSeries;
    import org.jfree.data.time.TimeSeriesCollection;
    import org.jfree.ui.ApplicationFrame;
    import org.jfree.ui.RefineryUtilities;
    import b_BusinessLayer.BusinessUser;
    
    /**
     * A demonstration application showing a time series chart where you can dynamically add
     * (random) data by clicking on a button.
     *
     */
    public class DynamicDataDemo extends ApplicationFrame implements ActionListener {
    
        /** The time series data. */
        public TimeSeries series;
        private BusinessUser dati;
        /** The most recent value added. */
        private double lastValue = 100.0;
        /**
         * Constructs a new demonstration application.
         *
         * @param title  the frame title.
         */
        public DynamicDataDemo(final String title,BusinessUser dati) {
    
            super(title);
            this.series = new TimeSeries("Random Data", Millisecond.class);
            this.dati=dati;
            final TimeSeriesCollection dataset = new TimeSeriesCollection(this.series);
            final JFreeChart chart = createChart(dataset);
            
            final ChartPanel chartPanel = new ChartPanel(chart);
            final JButton button = new JButton("Add New Data Item");
            button.setActionCommand("ADD_DATA");
            button.addActionListener(this);
    
            final JPanel content = new JPanel(new BorderLayout());
            content.add(chartPanel);
            content.add(button, BorderLayout.SOUTH);
            chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
            setContentPane(content);
    
    
        }
    
        /**
         * Creates a sample chart.
         *
         * @param dataset  the dataset.
         *
         * @return A sample chart.
         */
        private JFreeChart createChart(final XYDataset dataset) {
            final JFreeChart result = ChartFactory.createTimeSeriesChart(
                "Dynamic Data Demo",
                "Time",
                "Value",
                dataset,
                true,
                true,
                false
            );
            final XYPlot plot = result.getXYPlot();
            ValueAxis axis = plot.getDomainAxis();
            axis.setAutoRange(true);
            axis.setFixedAutoRange(20000.0);  // 60 seconds
            axis = plot.getRangeAxis();
            axis.setRange(-100.0, 0.0);
            return result;
        }
        
        public void add_valore(double val){
          this.series.add(new Millisecond(),val);
        }
        
        public void registra(){
          for(int i=0;i<20;i++)
          {
            this.series.add(new Millisecond(),this.dati.getSegnale());
            System.out.println("ciao");
          }
    
        }
    
        // ****************************************************************************
        // * JFREECHART DEVELOPER GUIDE                                               *
        // * The JFreeChart Developer Guide, written by David Gilbert, is available   *
        // * to purchase from Object Refinery Limited:                                *
        // *                                                                          *
        // * http://www.object-refinery.com/jfreechart/guide.html                     *
        // *                                                                          *
        // * Sales are used to provide funding for the JFreeChart project - please    *
        // * support us so that we can continue developing free software.             *
        // ****************************************************************************
    
        /**
         * Handles a click on the button by adding new (random) data.
         *
         * @param e  the action event.
         */
        public void actionPerformed(final ActionEvent e) {
    
       
       }
    
        /**
         * Starting point for the demonstration application.
         *
         * @param args  ignored.
         */
        public static void main(final String[] args) {
    
          BusinessUser d= new BusinessUser();
          final DynamicDataDemo demo = new DynamicDataDemo("Dynamic Data Demo",d);
          demo.pack();
          RefineryUtilities.centerFrameOnScreen(demo);
          demo.setVisible(true);
          demo.series.add(new Millisecond(),d.getSegnale());
          demo.series.add(new Millisecond(),d.getSegnale());
          demo.series.add(new Millisecond(),d.getSegnale());
    
    
        }
    la cosa stranissima è che se prendo tutto il codice presente nel Main quindi questo

    codice:
          BusinessUser d= new BusinessUser();
          final DynamicDataDemo demo = new DynamicDataDemo("Dynamic Data Demo",d);
          demo.pack();
          RefineryUtilities.centerFrameOnScreen(demo);
          demo.setVisible(true);
          demo.series.add(new Millisecond(),d.getSegnale());
          demo.series.add(new Millisecond(),d.getSegnale());
          demo.series.add(new Millisecond(),d.getSegnale());

    e lo collego ad un'evento di un bottone di un'altra finestra

    il grafico mi si apre correttamente ma aspetta di creare tutti e tre i segnali e poi lo visualizza di colpo! (menter eseguendo lo stesso codice nel main della classe i punti venivano inseriti ogni 2 secondi [il tempo impiegato dalla funzione getsegnale()])

    nell'alro caso invece resta una finestra grigia x 6 secondi e poi mi disegna di colpo il grafico!!!

    ho provato anche a lanciare un thread apposta x il grafico ma non cambia niente...secondo voi cosa può essere?

    grazie mille!!
    "durante i primi 5 miuti di pioggia nel bosco c'è ancora asciutto, poi quando smetterà di piovere nel bosco cadranno gocce per 5 minuti.....la natura ha un'ottima memoria..."

    http://www.kumbe.it

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