2013-04-13 2 views
5

Я работаю над круговой диаграммой с 4 различными элементами. Я могу заставить элементы появляться в JFrame, но я не могу закончить круг круговой диаграммы. Эти элементы:не удалось заполнить круг круговой диаграммы

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

     } 

Этот метод помещает элементы вместе на JFrame, но только дает мне около 120 градусов круга. :

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

     } 
    } 

Я в затруднении. У меня около 10 недель опыта с Java, поэтому это в основном проб и ошибок. Я ищу способ завершить круг. Я уменьшил значения до самой низкой точки, которая заставит все цвета отображаться. Все, что больше, устранит один цвет или другой.

Надеюсь, вы сможете помочь. Вот полная программа IAPieChart:

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

, что ожидается результат? – mishadoff

+0

+1 для [sscce] (http://sscce.org/). См. Также [tag: jfreechart], который включает в себя ['PiePlot'] (http://www.jfree.org/jfreechart/api/javadoc/org/jfree/chart/plot/PiePlot.html) с [source] (http : //www.jfree.org/jfreechart/api/javadoc/src-html/org/jfree/chart/plot/PiePlot.html). – trashgod

ответ

1

Вы

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

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

Однако это всегда будет давать ENDPOINT = 0 в качестве умножения на ноль каждый раз. Попробуйте сделать это

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

Я просто хотел убедиться, что вы, ребята, знаете, насколько я ценю помощь с частью апплета моего класса Java II. Это была трудная неделя, и вы, ребята, были неотъемлемой частью моей идеи. Это далеко не полный, но он соответствует требованиям курса. Я хотел бы дать кредит, где кредит должен быть, а вы - хорошие преподаватели. Желаем удачи в ваших начинаниях! http://apexsouthwest.com/PieChart/index.html – 2013-04-17 16:26:20

4

Если вы просто хотите, чтобы показать круговую диаграмму, где arc value является Веса сегментов, внесли изменения в вашем розыгрыше цикла.

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

В результате получается нечто вроде этого:

enter image description here

Как вы видите, есть небольшая пустая область, которая, как я полагаю, вызвана накопленной ошибки округления. Можно решить, вычерчивая последний сегмент с помощью arcValue, который дополняет сумму всех предыдущих значений до 360.

2

Существует небольшое смешение с arcStart расчет в исходном методе. Он должен начинаться с конца предыдущей дуги. Рассмотрим этот слегка модифицированный метод. Комментарии описывают обновленные строки.

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

Он заменяет линия:

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

с:

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

И заменяет линия:

radius += pieValue[i].arcValue; 

с:

endPoint += pieValue[i].arcValue; 

Вот результат:

enter image description here

Не забудьте позвонить super.paintComponent(g); в paintComponent(). Кроме того, вы можете добавить анти рендеринг сглаживанием подсказки, чтобы сгладить изображение немного, а именно:

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

Я узнал, что я накапливая неправильные значения из обоих ответов от phcoding и mishadoff. Однако с рекомендацией phcoding я придумал дополнительные экземпляры массива pieValue. Оба ответа были обогащены, и мой опыт увеличился благодаря вашим ответам.

mishadoff: Могу ли я определить ваше определение «веса», как вы упомянули в своем ответе? Когда я думаю о весах, я представляю себе точку привязки, где начинается дуга, тогда заданное значение состоит в том, насколько она будет увеличиваться в ее движении по радиусу круга. Это близко?

phcoding & mishadoff: Я намерен помещать это в апплет, вы видите какие-либо проблемы с этим, например, перенос этого кода в апплет? Я спрашиваю, потому что любая рекомендация, которую вы мне дадите, займет буквально часы от моего времени программирования, и я буду им в этом нуждаться.

Спасибо вам большое!

Ред.

+0

Вы закодировали его как JComponent, и у вас есть свои методы рисования, поэтому вы можете просто добавить это в апплет. Этот урок поможет вам, если вы окажетесь застряли. http://www.codeproject.com/Articles/34280/How-to-Write-Applet-Code – phcoding

+0

Что означает @mishadoff по весу - это относительные размеры каждого из ваших разделов в пироге (в вашем случае 5,4, 3,2). – phcoding

+0

phchoding: учебник по проекту кода поможет в других областях моей курсовой работы. Мне нужно будет сыграть с этими размерами, чтобы получить точный дубликат круговой диаграммы, с которой я работаю. Я поняла, что я сказал, что означает «вес». Теперь я не чувствую себя так плохо в своей логике. Я чувствую, что это относительно прилично, когда вы помогаете в этом упражнении.Благодарим вас за добросовестное выполнение этой проблемы. Хороших выходных! – 2013-04-13 16:08:15

Смежные вопросы