<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Swing


    天行健 君子以自強(qiáng)不息

    posts - 69, comments - 215, trackbacks - 0, articles - 16
       :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    setXORMode的用法 轉(zhuǎn)載不一定正確

    Posted on 2007-08-09 11:17 zht 閱讀(2321) 評(píng)論(0)  編輯  收藏 所屬分類: Swing


    在一個(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)題了?

    主站蜘蛛池模板: 浮力影院亚洲国产第一页| 亚洲国产成人一区二区三区| 国产午夜影视大全免费观看| 国产在线19禁免费观看国产| 亚洲国产成人久久综合区| 亚洲国产美女精品久久久久∴| 亚洲国产一区二区a毛片| 国产午夜亚洲精品| 国产VA免费精品高清在线| 久久A级毛片免费观看| 成人午夜视频免费| 久久亚洲中文字幕精品一区四| 亚洲色欲色欲综合网站| 大桥未久亚洲无av码在线| 全免费a级毛片免费看| 亚洲AⅤ优女AV综合久久久| 亚洲综合久久久久久中文字幕| 亚洲精品成a人在线观看☆| 一个人免费视频观看在线www | 97国免费在线视频| 亚洲中文无码永久免费| 亚洲V无码一区二区三区四区观看| 亚洲一卡2卡3卡4卡乱码 在线| 国产无遮挡无码视频免费软件| 国产色爽免费视频| 亚洲日韩亚洲另类激情文学| 99免费在线观看视频| 亚洲日韩中文无码久久| WWW国产成人免费观看视频| 日韩在线免费电影| 亚洲成熟丰满熟妇高潮XXXXX | 日韩av无码成人无码免费| 亚洲伦理一区二区| 84pao强力永久免费高清| 亚洲精品无码不卡在线播HE| A毛片毛片看免费| 国产成人亚洲精品狼色在线| 中文字幕无线码免费人妻| 久久久久亚洲av成人无码电影 | 成人区精品一区二区不卡亚洲| 歪歪漫画在线观看官网免费阅读 |