Swing 自定义绘画:应该处理“图形”对象吗?

Swing custom painting: should `Graphic` object be disposed?

当覆盖任何 JComponent 中的 public void paintComponent(Graphics g) 以执行该 JComponent 的自定义绘画时,是否应将 Graphic 对象 g 放置在这幅画(以及为什么)?

public void paintComponent(Graphics g) {
    super.paintComponent(g);       
    g.drawString("To dispose or not to dispose ? ",10,20);
    //dispose or avoid ?
    g.dispose();  
}

通常,如果资源不是您创建的,则处置它不是您的工作。由于该图形正在传递给您,我不担心处理它。

否不处理paintComponent中的Graphics对象。这将阻止其他组件绘制。

使用 Graphics.dispose 的正确方法是在绘制到图像缓冲区时,例如

BufferedImage im = new BufferedImage(...,...);
Graphics g = im.getGraphics();
JPanel.paint(g); // for example
g.drawLine(...); // another example
g.dispose();

除非您的代码创建了 Graphics 对象,否则不应释放 Graphics 对象。

JComponentpaint()方法会创建一个Graphics对象,传递给每个组件的三个绘制方法。 参见:A Closer Look at the Painting Mechanisn.

paint() 方法将在组件绘制完成后 dispose() 这个临时 Graphics 对象。查看代码:https://github.com/openjdk/jdk/blob/master/src/java.desktop/share/classes/javax/swing/JComponent.java

如果您手动创建一个 Graphics 对象,那么您应该释放它:

Graphics2D g2d = (Graphics2D)g.create();

// do custom painting

g2d.dispose();

通常情况下,如果您打算通过向 Graphics 添加 AffineTransform 来改变绘画,创建传递的 Graphics 对象的副本是个好主意。