我意识到大多数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);
}
这是一个好习惯吗?或者结束了?
答案 0 :(得分:15)
你根本不应该改变传入的Graphics对象,而是在你随后处理它的副本上执行所有图形操作。那时根本不需要重置状态。
public void paintComponent(Graphics g1) {
super.paintComponent(g1);
final Graphics2D g = (Graphics2D)g1.create();
try {
// ...Whole lotta drawing code...
} finally {
g.dispose();
}
}
答案 1 :(得分:3)
是的,这是一个非常好的做法。你的表现不是很高(相对于实际的绘画操作),如果你是的话,你可以省去一堆悲伤对图形上下文进行不寻常的更改。不要过分 - 例如,你可能不需要担心颜色设置。
另一种方法是不假设图形上下文,并在每次绘画之前设置所有必要的属性,以防它们被设置为不稳定的东西。 尽量避免为每个操作自由创建和处理Graphics对象。
如果修改后应始终恢复的特定属性:(因为它们可能会造成不良后果并产生意外后果):
不用担心的属性: