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 并且您尚未在构造函数中初始化 graphics2Dimage 可能是当您全部调用putPixel 方法 class 可能没有显示。因此,您将 graphics2D 变为 null,因为它仅在调用 paintComponent 时初始化,并且在显示此 class 时调用它。

解决方案可能是将 imagegraphics2D 的初始化代码移至构造函数,这样在调用 putPixel 时就不会遇到 null

注意

您随意调用了方法repaint()。您应该记住 repaint() 调用 paint() 方法,后者又调用 paintComponent() 方法。因此,如果您在 paintComponent() 方法中调用 repaint(),您 运行 将面临创建无限循环的风险。在这里,您在 paintComponent 中调用了两次,在 paintComponent 调用的 clear 方法中又调用了一次。