我试图研究Java的2D渲染是如何工作的,但我永远无法理解它。这是我主类中的代码:
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Main{
public static void main(String args[]) {
JFrame frame = new JFrame();
frame.setSize(new Dimension(500,500));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setTitle("JFrame testing");
frame.setVisible(true);
Frame panel = new Frame();
frame.add(panel);
}
}
然后是JPanel
类:
import java.awt.Graphics;
import javax.swing.JPanel;
public class Frame extends JPanel{
private static final long serialVersionUID = 1L;
public Frame() {
Graphics g = this.getGraphics();
g.drawRect(0, 0, 100, 100);
this.paintComponent(g);
}
}
我也得到了这个例外,但我不确定它是什么意思:
Exception in thread "main" java.lang.NullPointerException
at Frame.<init>(Frame.java:10)
at Main.main(Main.java:18)
我基本上只是想在一个面板上绘制一个矩形,以便在我创建的框架上显示。我听说过paintComponent
方法,但我也不完全理解。
答案 0 :(得分:1)
您应该从不使用组件的getGraphics()
。
尝试以下代码
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawRect(0, 0, 100, 100);
//this.paintComponent(g);
}
修改强>
&#34; 为什么是super.paintComponent(g);在方法中再次调用?&#34;
paintComponent
的{{3}}说得很好:
如果你没有调用超级实现,你必须尊重不透明 属性,即如果此组件是不透明的,则必须完全 以非不透明的颜色填充背景。如果你不尊重 opaque属性你可能会看到视觉文物。