【问题标题】:Swing custom painting: should `Graphic` object be disposed?Swing 自定义绘画:是否应该处置“图形”对象?
【发布时间】:2021-10-22 03:19:16
【问题描述】:

当在任何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();  
}

【问题讨论】:

标签: java swing graphics custom-painting


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    否不要在paintComponent 中释放Graphics 对象。这将阻止其他组件绘制。

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

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

    【讨论】:

      【解决方案3】:

      除非您的代码创建了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 对象的副本。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-27
        • 1970-01-01
        • 2016-12-13
        相关资源
        最近更新 更多