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
对象。
JComponent
的paint()
方法会创建一个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 对象的副本是个好主意。
当覆盖任何 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
对象。
JComponent
的paint()
方法会创建一个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 对象的副本是个好主意。