2013-04-13 15 views
5

Sto lavorando a un grafico a torta con 4 elementi diversi. Posso far comparire gli elementi in JFrame ma non riesco a completare il cerchio del grafico a torta. Questi sono gli elementi:impossibile completare il cerchio di un grafico a torta

public static class PieChart extends JComponent { 

     IAPieChart[] pieValue = {new IAPieChart(5, Color.green), 
           new IAPieChart(4, Color.orange), 
           new IAPieChart(3, Color.blue), 
           new IAPieChart(2, Color.red) 

     }; 

Ora che gli elementi sono istanziati, e caricati nella matrice, io uso questo metodo per dipingerli:

public void paintComponent(Graphics g) { 

      drawPie((Graphics2D) g, getBounds(), pieValue); 

     } 

Questo metodo mette insieme gli elementi sul JFrame ma mi dà solo circa 120 gradi del cerchio. :

void drawPie(Graphics2D g, Rectangle area, IAPieChart[] pieValue){ 

      double sum = 0.0; 
      for (int i = 0; i < pieValue.length; i++) { 

       sum += pieValue[i].arcValue; 
      } 

      double endPoint = 0.0D; 
      int arcStart = 0; 
      for (int i = 0; i < pieValue.length; i++){ 

       endPoint = (int) (endPoint * 360/sum); 
       int radius = (int) (pieValue[i].arcValue * 360/ sum); 
       g.setColor(pieValue[i].color); 
       g.fillArc(area.x, area.y, area.width, area.height, arcStart , radius); 
       radius += pieValue[i].arcValue; 
      } 

     } 
    } 

Sono in perdita. Ho circa 10 settimane di esperienza con Java, quindi questo è principalmente per tentativi ed errori. Sto cercando un modo per completare il cerchio. Ho ridotto i valori al punto più basso che avrebbe mostrato tutti i colori. Qualunque cosa più grande eliminerà un colore o l'altro.

Spero che tu possa aiutare. Qui è la piena IAPieChart programma:

package iapiechart; 

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Rectangle; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 



class IAPieChart{ 

    double arcValue;  // passes a value for the calculation of the arc. 
    Color color;   // holds value for color (expressed as an integer 

    public IAPieChart(double value, Color color){ 

     this.arcValue = value; 
     this.color = color; 
    } 


    public static class PieChart extends JComponent { 

     IAPieChart[] pieValue = {new IAPieChart(5, Color.green), 
           new IAPieChart(4, Color.orange), 
           new IAPieChart(3, Color.blue), 
           new IAPieChart(2, Color.red) 

     }; 

     public void paintComponent(Graphics g) { 

      drawPie((Graphics2D) g, getBounds(), pieValue); 

     } 

     void drawPie(Graphics2D g, Rectangle area, IAPieChart[] pieValue){ 

      double sum = 0.0; 
      for (int i = 0; i < pieValue.length; i++) { 

       sum += pieValue[i].arcValue; 
      } 

      double endPoint = 0.0D; 
      int arcStart = 0; 
      for (int i = 0; i < pieValue.length; i++){ 

       endPoint = (int) (endPoint * 360/sum); 
       int radius = (int) (pieValue[i].arcValue * 360/ sum); 
       g.setColor(pieValue[i].color); 
       g.fillArc(area.x, area.y, area.width, area.height, arcStart , radius); 
       radius += pieValue[i].arcValue; 
      } 

     } 
    } 
    public static void main(String[] args) { 

     JFrame frame = new JFrame(); 

     frame.getContentPane().add(new PieChart()); 
     frame.setSize(300, 300); 
     frame.setLocationRelativeTo(null); 
     frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 

     } 
} 
+0

cosa si intende per risultato? – mishadoff

+0

+1 per [sscce] (http://sscce.org/). Vedi anche [tag: jfreechart], che include ['PiePlot'] (http://www.jfree.org/jfreechart/api/javadoc/org/jfree/chart/plot/PiePlot.html) con [source] (http : //www.jfree.org/jfreechart/api/javadoc/src-html/org/jfree/chart/plot/PiePlot.html). – trashgod

risposta

1

Hai

  double endPoint = 0.0D; 
      int arcStart = 0; 
      for (int i = 0; i < pieValue.length; i++){ 

      endPoint = (int) (endPoint * 360/sum); 
      ... 

Tuttavia, questo darà sempre endPoint = 0 come moltiplicatore per ogni zero. Prova a fare lo

   endPoint += (int) (endPoint * 360/sum); 
+0

Volevo solo essere sicuro che voi ragazzi sappiate quanto apprezzo l'aiuto con la porzione di applet della mia classe Java II. È stata una settimana dura tutto intorno e voi ragazzi siete stati parte integrante nel portare a compimento la mia idea. Non è affatto completo ma soddisfa i requisiti del corso. Mi piace dare credito a chi è dovuto il credito e voi signori siete dei bravi tutori. Buona fortuna per i tuoi sforzi! http://apexsouthwest.com/PieChart/index.html –

4

Se si vuole solo mostrare grafico a torta in cui arc value è a pesi per i segmenti, ha fatto una modifica al tuo ciclo di pareggio.

int arcStart = 0; 
for (int i = 0; i < pieValue.length; i++){ 
    int radius = (int) (pieValue[i].arcValue * 360.0/sum); 
    g.setColor(pieValue[i].color); 
    g.fillArc(area.x, area.y, area.width, area.height, arcStart, radius); 
    arcStart += radius; 
} 

Il risultato è qualcosa di simile:

enter image description here

Come si vede c'è una piccola zona vuota, che, suppongo, causata da errore di arrotondamento accumulato. Può essere risolto disegnando l'ultimo segmento con arcValue che completa la somma di tutti i precedenti a 360.

2

C'è un po 'di confusione con il calcolo arcStart nel metodo originale. Dovrebbe iniziare dalla fine dell'arco precedente. Considera questo metodo leggermente modificato. I commenti descrivono le linee aggiornate.

void drawPie(Graphics2D g, Rectangle area, IAPieChart[] pieValue){ 

    double sum = 0.0; 
    for (int i = 0; i < pieValue.length; i++) { 

     sum += pieValue[i].arcValue; 
    } 

    double endPoint = 0.0D; 
    int arcStart = 0; 

    for (int i = 0; i < pieValue.length; i++){ 
     arcStart = (int) (endPoint * 360/sum); //old line was: endPoint = (int) (endPoint * 360/sum); 
     int radius = (int) (pieValue[i].arcValue * 360/ sum); 
     g.setColor(pieValue[i].color); 
     g.fillArc(area.x, area.y, area.width, area.height, arcStart , radius); 
     endPoint += pieValue[i].arcValue; //old line was: radius += pieValue[i].arcValue; 
    } 
} 

Sostituisce linea:

endPoint = (int) (endPoint * 360/sum); 

con:

arcStart = (int) (endPoint * 360/sum); 

e sostituisce la linea:

radius += pieValue[i].arcValue; 

con:

endPoint += pieValue[i].arcValue; 

Ecco il risultato:

enter image description here

Non dimenticare di chiamare super.paintComponent(g); in paintComponent(). Inoltre, si consiglia di aggiungere l'anti aliasing il rendering suggerimenti per lisciare l'immagine un po ', vale a dire:

public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
       RenderingHints.VALUE_ANTIALIAS_ON); 
     drawPie((Graphics2D) g, getBounds(), pieValue); 
    } 
1

ho imparato che sto accumulando i valori errati da entrambe le risposte phcoding e mishadoff. Tuttavia, con la raccomandazione di phcoding, ho trovato istanze aggiuntive dell'array pieValue. Entrambe le risposte sono state arricchenti e la mia esperienza è aumentata attraverso le tue risposte.

mishadoff: Posso avere la tua definizione di "pesi" come hai detto nella tua risposta? Quando penso ai pesi immagino un punto di ancoraggio in cui l'arco inizia, quindi il valore dato è quanto aumenterà nel suo viaggio lungo il raggio del cerchio. È così vicino?

phcoding & mishadoff: ho intenzione di inserire questo in un'applet per eventuali problemi con questo, ad esempio il trasferimento di questo codice nell'applet? Chiedo perché ogni raccomandazione che mi darai prenderà letteralmente meno ore del mio tempo di programmazione, e avrò bisogno di loro.

Grazie mille a tutti!

Ed.

+0

Lo hai codificato come JComponent e hai i tuoi metodi di disegno in modo da poterlo aggiungere a un'applet. Questo tutorial può aiutarti se ti trovi bloccato. http://www.codeproject.com/Articles/34280/How-to-Write-Applet-Code – phcoding

+0

Ciò che @mishadoff intende per pesi è la dimensione relativa di ciascuna delle sezioni nella torta (nel tuo caso 5,4, 3,2). – phcoding

+0

phchoding: il tutorial sul progetto del codice aiuterà in altre aree dei miei corsi. Dovrò giocare con questi formati alcuni per ottenere il duplicato esatto del grafico a torta con cui lavoro. Sono venuto chiaro dopo aver postato cosa significa "pesi". Non mi sento così male per la mia logica ora. Sento che è relativamente decente dopo aver ricevuto il tuo aiuto con questo esercizio.Grazie per il diligente seguito di questo problema. Buon fine settimana! –

Problemi correlati