Java Graphics 在默认情况下,在绘制直线或填充图形时,新的像素会覆盖旧的像素,因此你会完全忘记以前的图形,这被称作“绘制”模式,可以通过调用setPaintMode()方法来设置。 如果你想要删除图形,那么需要记住覆盖了哪些东西,但是Graphics的绘制方法并没有提供这种功能。但是,如果你转换到异或绘制模式,那么绘制操作就是可逆的,而无需记住被覆盖的图形是什么。为设置该模式,你可以使用Graphics的setXORMode方法,该方法定义如下:
public void setXORMode( Color alt )
在设置该模式后,你事实上是用一种不同的颜色在进行绘制,该颜色是当前绘制颜色与 setXORMode的参数中设定的替换颜色alt的组合。通常,当你在异或模式中绘制时,可以把当前颜色设置为想要用于绘制的颜色(称为绘制颜色),而把背景色指定为替换颜色。现在,你在背景上绘制时,实际使用的颜色是绘制颜色。其效果仿佛与默认绘制模式无异。但是,如果在具有当前绘制颜色的像素上绘制的话,像素会变成替换颜色,换句话说,就是背景色。如果在其他颜色的像素上绘制的话,该像素又恢复到原来的颜色。我们使用例子来说明一下,其中绘制颜色是黑色而背景色是白色,因此白色用作替换颜色。下表给出了在同一个像素上绘制两次时的效果,其中的当前颜色是黑色,而背景色和替换色都是白色。替换颜色和绘制颜色设置如下:
g.setXORMode( Color.white );
g.setColor( Color.black );
你可以看到,当你在白色背景上用黑色绘制,得到的是黑色。当重复该过程,再次得到白色,因此重现了背景。换句话说,在背景上两次绘制相同的图形,首先会显示该图形,而第二次则删除了该图形。类似的,用黑色在黑色背景上绘制首先产生的是白色(因为替换颜色是白色),然后又回到黑色。同样的,执行相同的操作两次等效于不执行该操作。如果你在其他颜色上绘制,那么第一次操作之后得到的颜色是未定义的,而重复相同的操作,又回到原来的颜色。因此,通过使用异或模式,你可以绘制一个图形,然后再次绘制即可删除它。
如果你发现这样做难于记忆,我们以一种稍有不同的方法考察一下它。我们把替换颜色称作alt,绘制颜色称作draw。当你设置异或模式时,事实上创建了一个新的画笔,其颜色由下列表达式给定:
alt ^ draw
而你的操作是把该颜色与所绘制像素的颜色异或,换句话说,对于任一像素来说,产生的颜色是:
pixel ^ alt ^ draw
如果重复该操作,产生的颜色是:
pixel ^ ( alt ^ draw ) ^ ( alt ^ draw )
由于任何东西与本身异或的结果都是零,最后两个括号中的项消去了,只剩下pixel,也就是原来的颜色。这就解释了为什么绘制两次会返回到初始状态。如果你在与替换颜色(在我们的例子中是背景色)相同的像素上绘制一次,得到的颜色是:
alt ^ alt ^ draw
这当然是draw,也就是说,在背景上一次绘制得到的像素颜色是绘制颜色。而具有绘制颜色的像素上绘图,产生的颜色是:
draw ^ alt ^ draw
两个draw项再一次抵消,剩下alt,即背景色。最后,在任何其他颜色上绘制,结果是:
other ^ alt ^ draw
它表示的颜色并不是显而易见的,因为使用不同的颜色模型,其结果是不同的。