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

Trying to draw a Pie chart with AWT in Java

我正在尝试在 Java 中绘制饼图(使用 AWT),其中饼图的 "pieces" 是通过 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[]
  • 你在使用 Frame 而你应该使用 JFrame
  • 你应该覆盖 paintComponent 而不是 paint
  • 你应该使用 JPanel 而不是 Panel

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

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

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

不要忘记将 g 更改为 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 Tutorials