在一個(gè)JPanel上的畫(huà)圖函數(shù):
void draw(Graphics g,int x, int y, Color color){
g.setColor(color);
//g.setXORMode(color); //加上就畫(huà)不出圓
g.fillOval(x,y,20,20);
}
單擊事件:
public void mouseClicked(MouseEvent event){
g = getGraphics();
draw(g,event.getX(),event.getY(),Color.black);
}
我想單擊鼠標(biāo)畫(huà)一個(gè)圓,再單擊一次擦去。可是在draw函數(shù)中若加上g.setXORMode(color);就畫(huà)不出圓來(lái),注釋掉則能正常作圖,請(qǐng)問(wèn)這是怎么回事??
-------------------------------------
XOR 異或
------------------------------------
setXORMode()方法設(shè)置繪圖模式可以使一個(gè)新的對(duì)象一異或操作的方式加入窗口中
他指定了繪制對(duì)象時(shí)戶窗口進(jìn)行異或操作的顏色。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class DrawsDemo{
public static void main(String[] args){
ShapesFrame sf=new ShapesFrame();
}
}
class ShapesFrame extends JFrame{
public ShapesFrame(){
setTitle("請(qǐng)教setXORMode的用法");
setSize(300,200);
XORPanel xp=new XORPanel();
Container container=getContentPane();
container.add(xp);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
}
class XORPanel extends JPanel{
static boolean flag=false;
public XORPanel(){
addMouseListener( new MouseAdapter(){
public void mouseClicked(MouseEvent mevent){
repaint();
}
}
);
}
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Color.red);
if(!flag){
g.setXORMode(Color.blue); //加上就畫(huà)不出圓
}
flag=!flag;
g.fillOval(10,10,20,20);
//draw(g,10,10,Color.blue);
}
void draw(Graphics g,int x, int y, Color color){
}
}
-------------------------------------
樓主,冷月的代碼可以劃出圖來(lái),并且通過(guò)點(diǎn)擊鼠標(biāo)可以進(jìn)行紅色與藍(lán)色的轉(zhuǎn)換。如果要實(shí)現(xiàn)你所要求的功能“單擊鼠標(biāo)畫(huà)一個(gè)圓,再單擊一次擦去”,可以將冷月的public void paintComponent(Graphics g)方法中的代碼改為以下形式:
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setColor(Color.red);
g.fillOval(10, 10, 200, 200);//*
if (!flag)
{
g.clearRect(10, 10, 200, 200);//*
}
flag = !flag;
}
----------------------------------------------------
呵,冷月兄的代碼是對(duì)的
一行一行對(duì)過(guò)去,終于發(fā)現(xiàn),自己把paintComponent的p敲成P了。難怪死活不執(zhí)行,當(dāng)即吐血數(shù)升
最后有一點(diǎn)不明白:我理解的setXORMode(color)應(yīng)該是把指定的color與要繪圖的區(qū)域內(nèi)的顏色進(jìn)行異或操作。即:
如區(qū)域內(nèi)無(wú)顏色,應(yīng)能繪出指定顏色的圖形。
如區(qū)域內(nèi)已存在指定顏色,異或操作后應(yīng)擦去指定顏色的圖形
如區(qū)域內(nèi)內(nèi)已存在其它顏色,應(yīng)繪制出該顏色和指定顏色進(jìn)行異或操作后的新顏色的圖形。
可程序運(yùn)行結(jié)果是:如果區(qū)域內(nèi)無(wú)顏色,無(wú)法繪制出圖形.是不是我理解的有問(wèn)題?
文檔對(duì)setXORMode的說(shuō)明是:
Sets the paint mode of this graphics context to alternate between this graphics context's current color and the new specified color
讓圖形上下文的繪圖模式在其原有顏色與指定的新顏色間進(jìn)行轉(zhuǎn)換
也沒(méi)有說(shuō)當(dāng)不存在原有顏色時(shí)就繪不出圖形來(lái)啊
---------------------------------------------------------
CoffeeMachine(TwoBeds)兄說(shuō)的對(duì)的,我對(duì)java圖形也沒(méi)怎么研究過(guò),但是對(duì)setXormode的理解
和你稍微有點(diǎn)不同,我也認(rèn)為setXormode可以搽去圖形,但是
g.setColor(Color.blue);
g.setXORMode(Color.blue);
兩句話每次都執(zhí)行的話,藍(lán)色和藍(lán)色xor就沒(méi)了,什么也顯示不出來(lái)了,其實(shí) xor是發(fā)生作用的,
但要有個(gè)開(kāi)關(guān)變量,第一次讓他不xor,第二次讓他xor,把圖形就xor沒(méi)了,
不信,你把setXormode(這里的顏色換成別的)你可以看到xor后的顏色既不是藍(lán)也不是...
是兩種顏色的疊加。
不知道對(duì)不對(duì),請(qǐng)指教。
---------------------------------------
對(duì)的,xor能擦去相同顏色的圖形,能對(duì)不同顏色進(jìn)行疊加。但似乎是繪圖區(qū)已繪制某種顏色的情況下用xor才能畫(huà)出圖形來(lái)。
記得以前學(xué)delphi的時(shí)候用異或模式是能在未著色的區(qū)域上繪圖的。執(zhí)行一次繪出指定顏色圖形,再執(zhí)行一次擦去,方便得很,java好象不太一樣。是不是對(duì)未著色的區(qū)域進(jìn)行異或操作時(shí)使用的“空”顏色是類似null的概念,任何值與之運(yùn)算結(jié)果都是“空”,所以繪不出圖形?
java文檔上關(guān)于setXORMode的說(shuō)明我也看不是很明白:
When drawing operations are performed, pixels which are the current color are changed to the specified color, and vice versa
執(zhí)行繪圖操作時(shí)當(dāng)前顏色的象素將變?yōu)橹付伾粗嗳弧?/p>
但是若當(dāng)前顏色為Color.red,setXORMode(Color.blue),繪圖后明明會(huì)變成綠色,而不是指定的藍(lán)色呀。這文檔寫(xiě)的是不是有問(wèn)題了?