首页 > 解决方案 > 尝试在 Java 中使用 AWT 绘制饼图

问题描述

我正在尝试用 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)

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

标签: javaruntime-errorawtpie-chart

解决方案


尝试以下操作:

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

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

检查完后,for looppaintComponent方法中添加以下内容

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

不要忘记将gs 更改为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();
    }
}

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

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


推荐阅读