在一個JPanel上的畫圖函數:
void draw(Graphics g,int x, int y, Color color){
g.setColor(color);
//g.setXORMode(color); //加上就畫不出圓
g.fillOval(x,y,20,20);
}
單擊事件:
public void mouseClicked(MouseEvent event){
g = getGraphics();
draw(g,event.getX(),event.getY(),Color.black);
}
我想單擊鼠標畫一個圓,再單擊一次擦去。可是在draw函數中若加上g.setXORMode(color);就畫不出圓來,注釋掉則能正常作圖,請問這是怎么回事??
-------------------------------------
XOR 異或
------------------------------------
setXORMode()方法設置繪圖模式可以使一個新的對象一異或操作的方式加入窗口中
他指定了繪制對象時戶窗口進行異或操作的顏色。
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("請教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); //加上就畫不出圓
}
flag=!flag;
g.fillOval(10,10,20,20);
//draw(g,10,10,Color.blue);
}
void draw(Graphics g,int x, int y, Color color){
}
}
-------------------------------------
樓主,冷月的代碼可以劃出圖來,并且通過點擊鼠標可以進行紅色與藍色的轉換。如果要實現你所要求的功能“單擊鼠標畫一個圓,再單擊一次擦去”,可以將冷月的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;
}
----------------------------------------------------
呵,冷月兄的代碼是對的
一行一行對過去,終于發現,自己把paintComponent的p敲成P了。難怪死活不執行,當即吐血數升
最后有一點不明白:我理解的setXORMode(color)應該是把指定的color與要繪圖的區域內的顏色進行異或操作。即:
如區域內無顏色,應能繪出指定顏色的圖形。
如區域內已存在指定顏色,異或操作后應擦去指定顏色的圖形
如區域內內已存在其它顏色,應繪制出該顏色和指定顏色進行異或操作后的新顏色的圖形。
可程序運行結果是:如果區域內無顏色,無法繪制出圖形.是不是我理解的有問題?
文檔對setXORMode的說明是:
Sets the paint mode of this graphics context to alternate between this graphics context's current color and the new specified color
讓圖形上下文的繪圖模式在其原有顏色與指定的新顏色間進行轉換
也沒有說當不存在原有顏色時就繪不出圖形來啊
---------------------------------------------------------
CoffeeMachine(TwoBeds)兄說的對的,我對java圖形也沒怎么研究過,但是對setXormode的理解
和你稍微有點不同,我也認為setXormode可以搽去圖形,但是
g.setColor(Color.blue);
g.setXORMode(Color.blue);
兩句話每次都執行的話,藍色和藍色xor就沒了,什么也顯示不出來了,其實 xor是發生作用的,
但要有個開關變量,第一次讓他不xor,第二次讓他xor,把圖形就xor沒了,
不信,你把setXormode(這里的顏色換成別的)你可以看到xor后的顏色既不是藍也不是...
是兩種顏色的疊加。
不知道對不對,請指教。
---------------------------------------
對的,xor能擦去相同顏色的圖形,能對不同顏色進行疊加。但似乎是繪圖區已繪制某種顏色的情況下用xor才能畫出圖形來。
記得以前學delphi的時候用異或模式是能在未著色的區域上繪圖的。執行一次繪出指定顏色圖形,再執行一次擦去,方便得很,java好象不太一樣。是不是對未著色的區域進行異或操作時使用的“空”顏色是類似null的概念,任何值與之運算結果都是“空”,所以繪不出圖形?
java文檔上關于setXORMode的說明我也看不是很明白:
When drawing operations are performed, pixels which are the current color are changed to the specified color, and vice versa
執行繪圖操作時當前顏色的象素將變為指定顏色,反之亦然。
但是若當前顏色為Color.red,setXORMode(Color.blue),繪圖后明明會變成綠色,而不是指定的藍色呀。這文檔寫的是不是有問題了?