簡體   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