我试图制作一个简单的应用程序只是为了试验Java图形,但我遇到了这个错误,所以如果有人可以帮助我,我真的很感激。 :)
我得到以下
Exception in thread "main" java.lang.NullPointerException
at Main.draw(Main.java:41)
at Main.createGUI(Main.java:36)
at Main.main(Main.java:20)
Java Result: 1
当我尝试运行以下代码时出现错误:
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Main extends JFrame {
private static final long serialVersionUID = 1L;
public JPanel panel;
public static void main(String[] args) {
Main m = new Main();
m.setSize(500, 700);
m.setDefaultCloseOperation(EXIT_ON_CLOSE);
m.createGUI();
m.setVisible(true);
}
private void createGUI() {
Container window = getContentPane();
panel = new JPanel();
panel.setPreferredSize(new Dimension(500, 700));
panel.setBackground(Color.WHITE);
window.add(panel);
Graphics paper = panel.getGraphics();
draw(paper);
}
private void draw(Graphics g){
g.drawRect(100, 100, 100, 100);
}
}
有人能告诉我如何解决这个错误的原因是什么?
谢谢!
答案 0 :(得分:7)
此行上的Graphics
对象
g.drawRect(100, 100, 100, 100);
是null
,因为您在 UI可见之前使用了JComponent#getGraphics
。这就是为什么通过覆盖JPanel
panel
的{{3}}进行自定义绘画总是更好。这样可以保证Graphics
Object
在使用之前先被初始化。
答案 1 :(得分:3)
永远不要使用getGraphics
。
如您所见,它可以返回null
。它充其量只是最后一个油漆循环的快照。在下一个油漆循环中,任何涂在其上的东西都会被覆盖。
Swing中的绘画是无国籍的。也就是说,在每个绘画周期中,您需要重新绘制您想要绘制的所有内容。
查看Custom Painting,了解在Swing中执行自定义绘画的概述
+1到reimeus
答案 2 :(得分:1)
NullPointerException
由Graphics g
为空引起,并且您尝试使用null
对象调用Graphics
方法之一。
如果您搜索,您会看到panel.getGraphics()
返回null是一个常见问题,并且有一些解决方案。请参阅:Any alternative to calling getGraphics() which is returning null