Graphics2D 总是返回 "NULL"
Graphics2D is returning "NULL" always
graphics2D 总是在下面的代码中返回 "NULL"。由于未调用 putPixel() 方法。我正在从表单设计中调用 PictureBox。
public class PictureBox extends JPanel {
Graphics2D graphics2D;
static BufferedImage image;
int imageSize = 300;
public PictureBox(){
setDoubleBuffered(false);
this.setBorder(UIManager.getBorder("ComboBox.border"));
this.repaint();
}
public void paintComponent(Graphics g){
super.paintComponent(g);
if(image == null){
image = new BufferedImage(imageSize, imageSize, BufferedImage.TYPE_INT_RGB);
graphics2D = (Graphics2D)image.createGraphics();
graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
clear();
}
Graphics2D g2D = (Graphics2D) g;
g2D.drawImage(image, 0, 0, this);
repaint();
}
public final void putPixel(int x, int y, Color color) {
if(graphics2D != null){
graphics2D.setColor(color);
graphics2D.drawLine(x, y, x, y);
repaint();
}
}
public void clear() {
graphics2D.setPaint(Color.WHITE);
graphics2D.fillRect(0, 0, imageSize,imageSize);
repaint();
}
}
putPixel 方法正在从 main 调用,其中我将 (x,y) 坐标存储在 Point2D 数组中。
由于您从 class 外部调用了 putPixel
并且您尚未在构造函数中初始化 graphics2D
和 image
可能是当您全部调用putPixel
方法 class 可能没有显示。因此,您将 graphics2D
变为 null
,因为它仅在调用 paintComponent 时初始化,并且在显示此 class 时调用它。
解决方案可能是将 image
和 graphics2D
的初始化代码移至构造函数,这样在调用 putPixel
时就不会遇到 null
。
注意
您随意调用了方法repaint()
。您应该记住 repaint()
调用 paint()
方法,后者又调用 paintComponent()
方法。因此,如果您在 paintComponent()
方法中调用 repaint()
,您 运行 将面临创建无限循环的风险。在这里,您在 paintComponent
中调用了两次,在 paintComponent
调用的 clear
方法中又调用了一次。
graphics2D 总是在下面的代码中返回 "NULL"。由于未调用 putPixel() 方法。我正在从表单设计中调用 PictureBox。
public class PictureBox extends JPanel {
Graphics2D graphics2D;
static BufferedImage image;
int imageSize = 300;
public PictureBox(){
setDoubleBuffered(false);
this.setBorder(UIManager.getBorder("ComboBox.border"));
this.repaint();
}
public void paintComponent(Graphics g){
super.paintComponent(g);
if(image == null){
image = new BufferedImage(imageSize, imageSize, BufferedImage.TYPE_INT_RGB);
graphics2D = (Graphics2D)image.createGraphics();
graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
clear();
}
Graphics2D g2D = (Graphics2D) g;
g2D.drawImage(image, 0, 0, this);
repaint();
}
public final void putPixel(int x, int y, Color color) {
if(graphics2D != null){
graphics2D.setColor(color);
graphics2D.drawLine(x, y, x, y);
repaint();
}
}
public void clear() {
graphics2D.setPaint(Color.WHITE);
graphics2D.fillRect(0, 0, imageSize,imageSize);
repaint();
}
}
putPixel 方法正在从 main 调用,其中我将 (x,y) 坐标存储在 Point2D 数组中。
由于您从 class 外部调用了 putPixel
并且您尚未在构造函数中初始化 graphics2D
和 image
可能是当您全部调用putPixel
方法 class 可能没有显示。因此,您将 graphics2D
变为 null
,因为它仅在调用 paintComponent 时初始化,并且在显示此 class 时调用它。
解决方案可能是将 image
和 graphics2D
的初始化代码移至构造函数,这样在调用 putPixel
时就不会遇到 null
。
注意
您随意调用了方法repaint()
。您应该记住 repaint()
调用 paint()
方法,后者又调用 paintComponent()
方法。因此,如果您在 paintComponent()
方法中调用 repaint()
,您 运行 将面临创建无限循环的风险。在这里,您在 paintComponent
中调用了两次,在 paintComponent
调用的 clear
方法中又调用了一次。