java - 尝试在 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)
我可以更改什么以使程序正常运行?
解决方案
尝试以下操作:
- 您
value[]
在分配数组时重新声明。 - 你
Frame
在应该使用的时候使用JFrame
- 你应该覆盖
paintComponent
而不是paint
- 你应该使用
JPanel
而不是Panel
另一方面,您扩展了面板而不是框架。这正是你应该做的,也是许多人犯的错误。总而言之,这是一次不错的绘画尝试。
检查完后,for loop
在paintComponent
方法中添加以下内容
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();
}
}
我添加了颜色,以便您可以看到饼图的不同部分。
有关绘画的更多信息,请查看Java 教程
推荐阅读
- python - 当窗口值之和为零时,滚动和不显示为零
- zsh - compgen:96:找不到命令:尝试自动完成 aws 时的 aws_completer
- asp.net-core - 从部分视图模式弹出 Ajax 调用更新父视图模型
- android - 在 Google Play 商店中结束测试轨道
- javascript - 反应原生返回类型错误:null 不是对象(评估 feeds.length)
- arrays - ngFor 数组对象中的角度循环
- python - 如何处理这个带有多个选项卡的 csv 文件?
- webgl - Godot 3.1 WebGL 上下文丢失使用移动浏览器的错误
- c++ - 如何使用文件和行号抛出错误?
- google-drive-api - google drive api v2/v3:exportLinks 和 File.export 是否相同?