繁体   English   中英

尝试在 Java 中使用 AWT 绘制饼图

[英]Trying to draw a Pie chart with AWT in Java

我正在尝试在 Java(使用 AWT)中绘制饼图,其中饼图的“部分”是通过 args 参数(用户输入)设置的。

这是我的代码:

public class Pie extends Panel
{
    int value[];
    int start = 0;

    public Pie(String[] args)
    {
        int value[] = new int[args.length];

        for(int i = 0; i<args.length; i++) //Error at this line
        {
            value[i] = Integer.parseInt(args[i]);
        }
    }

    public void paint(Graphics g)
    {

        for(int i = 0; i<value.length; i++)
        {
            g.fillArc(150, 150, 200, 200, start, value[i]);
            start = start + value[i];
        }
    }

    public static void main(String args[])
    {
        Frame f = new Frame("Piechart");
        Pie p = new Pie(args);
        f.add(p);
        f.setVisible(true);
        f.setSize(400, 400);
        f.addWindowListener(new WindowAdapter()
        {
            public void windowClosing(WindowEvent we)
            {
                System.exit(0);
            }
        });
    }}

当我尝试使用 4 个 args 参数(即 java Pie 90 90 90 90)运行程序时,我收到错误消息:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at Pie.paint(Pie.java:24)

我可以更改什么以使程序正常运行?

尝试以下操作:

  • 您在分配数组时重新声明value[]
  • 当您应该使用JFrame时,您正在使用Frame
  • 你应该覆盖paintComponent而不是paint
  • 你应该使用JPanel而不是Panel

另一方面,您扩展了面板而不是框架。 这正是你应该做的,也是许多人犯的错误。 总而言之,这是一次不错的绘画尝试。

检查完后,在paintComponent方法中的for loop之前添加以下内容

       Graphics2D g2d = (Graphics2D) g.create();
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);

不要忘记将g s 更改为g2d

这倾向于通过进行一些像素平均来在视觉上平滑粗糙的边缘。 根据您所绘制的内容,有时效果可能会很戏剧化。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Pie extends JPanel
{
    int value[];
    int start = 0;

    Color[] colors = {Color.red, Color.green, Color.blue, Color.orange};
    public Pie(String[] args)
    {
        value = new int[args.length];

        for(int i = 0; i<args.length; i++) //Error at this line
        {
            value[i] = Integer.parseInt(args[i]);
        }

    }

    public void paintComponent(Graphics g)  {
         super.paintComponent(g);
         if (value == null) {
             return;
         }
        for(int i = 0; i<value.length; i++) {
            g.setColor(colors[i%colors.length]);
            g.fillArc(150, 150, 200, 200, start, value[i]);
            start = start + value[i];
        }

    }

    public static void main(String args[])
    {
        JFrame f = new JFrame("Piechart");
        Pie p = new Pie(new String[]{"90","90","90", "90"});

        f.add(p);
        p.setPreferredSize(new Dimension(400, 400));
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        f.repaint();
    }
}

我添加了 colors 以便您可以看到饼图的不同部分。

有关绘画的更多信息,请查看Java 教程

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM