当覆盖paint或paintComponent时需要恢复图形原始状态

Che*_*eng 9 java graphics swing awt

我意识到大多数Java代码都会覆盖paint或paintComponent,它们中的大多数都没有恢复图形对象的旧状态,之后它们就改变了图形对象的状态.例如,setStroke,setRenderingHint ......

我想知道在从方法返回之前恢复图形对象的旧状态是否是一个好习惯.例如

public void paintComponent(Graphics g) {
    super.paintComponet(g);
    Stroke oldStroke = g.getStroke();
    g.setStroke(newStroke);
    // Do drawing operation.
    g.setStroke(oldStroke);
}
Run Code Online (Sandbox Code Playgroud)

这是一个好习惯吗?还是结束了?

ban*_*ity 15

你根本不应该改变传入的Graphics对象,而是在你随后处理它的副本上执行所有图形操作.那时根本不需要重置状态.

public void paintComponent(Graphics g1) {
    super.paintComponent(g1);
    final Graphics2D g = (Graphics2D)g1.create();
    try {
         // ...Whole lotta drawing code...
    } finally {
         g.dispose();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我将支持JavaDoc for JComponent同意这个答案:http://docs.oracle.com/javase/6/docs/api/javax/swing/JComponent.html#paintComponent%28java.awt.Graphics% 29 (3认同)