Java 无法完成饼图的圆

Java 无法完成饼图的圆,java,swing,graphics2d,pie-chart,Java,Swing,Graphics2d,Pie Chart,我正在制作一个包含4个不同元素的饼图。我可以让元素出现在JFrame中,但我无法完成饼图圆圈。这些是要素: public static class PieChart extends JComponent { IAPieChart[] pieValue = {new IAPieChart(5, Color.green), new IAPieChart(4, Color.orange),

我正在制作一个包含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;
            }

        }
    }
void drawPie(图形2D g、矩形区域、IAPieChart[]pieValue){
双和=0.0;
for(int i=0;i
我不知所措。我有大约10周的Java经验,所以这主要是尝试和错误。我正在寻找一种方法来完成这个循环。我将值降低到最低点,使所有颜色都显示出来。任何较大的颜色都会消除一种或另一种颜色

我希望你能帮忙。以下是完整的计划表:

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

        }
 }
包装图;
导入java.awt.Color;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.Rectangle;
导入javax.swing.JComponent;
导入javax.swing.JFrame;
类别图表{
double arcValue;//传递用于计算圆弧的值。
Color Color;//保存Color的值(表示为整数
公共图表(双值、彩色){
这个.arcValue=值;
这个颜色=颜色;
}
公共静态类PieChart扩展JComponent{
IapeChart[]pieValue={new IapeChart(5,Color.green),
新的IAPieChart(4,颜色为橙色),
新的IAPieChart(3,颜色为蓝色),
新IAPieChart(2,彩色,红色)
};
公共组件(图形g){
drawPie((Graphics2D)g,getBounds(),pieValue);
}
空心绘图饼图(图形2D g、矩形区域、IAPieChart[]pieValue){
双和=0.0;
for(int i=0;i
您有

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

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

如果只想显示饼图,其中
弧值
是线段的权重,请更改绘制周期

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;
}
int-arcStart=0;
for(int i=0;i
结果是这样的:


正如你所看到的,有一个小的空区域,我猜想是由累加舍入误差引起的。可以用最后一个段画出弧段的值,它的所有前值的和和为360。

< P>在原始方法中与<代码> 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;
    }
}
与:

arcStart = (int) (endPoint * 360 / sum);
endPoint += pieValue[i].arcValue;
并替换第行:

endPoint = (int) (endPoint * 360 / sum);
radius += pieValue[i].arcValue;
与:

arcStart = (int) (endPoint * 360 / sum);
endPoint += pieValue[i].arcValue;
结果如下:

不要忘记在
paintComponent()
中调用
super.paintComponent(g);
。此外,您可能需要添加抗锯齿渲染提示以稍微平滑图像,即:

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

我了解到我从phcoding和mishadoff的回复中积累了错误的值。然而,根据phcoding的建议,我提出了pieValue数组的其他实例。这两个回复都在丰富我的经验,通过您的回复我的经验也在增加

米沙多夫:我可以知道你在回答中提到的“重量”的定义吗?当我想到重量时,我想象一个锚定点,弧从那里开始,然后给出的值是它沿圆半径的移动会增加多少。接近吗

phcoding&mishadoff:我打算把它放进一个小程序中。你有没有想过这样做会有什么问题,比如把代码转移到小程序中?我问你,因为你给我的任何建议都会让我的编程时间减少几个小时,我需要它们

非常感谢你们两位


Ed.

预期结果是什么?+1 for。另请参见,其中包括with。您已经将其编码为JComponent,并且有了绘制方法,因此可以将其添加到小程序中。如果您发现自己陷入困境,本教程可以帮助您。通过权重@mishadoff表示饼图中每个部分的相对大小(在您的示例中为5,4,3,2).phchoding:代码项目教程将有助于我课程的其他方面。我将不得不使用这些尺寸,以获得我现在工作的饼图的精确副本