setXORMode的用法 (转载)

news/2024/7/8 5:09:57 标签: 图形, import, delphi, class, 文档, java
class="baidu_pl">
class="article_content clearfix">
class="htmledit_views">

 在一个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()方法设置绘图模式可以使一个新的对象一异或操作的方式加入窗口中
他指定了绘制对象时户窗口进行异或操作的颜色。

class="tags" href="/tags/IMPORT.html" title=import>import java.awt.*;
class="tags" href="/tags/IMPORT.html" title=import>import java.awt.event.*;
class="tags" href="/tags/IMPORT.html" title=import>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与要绘图的区域内的颜色进行异或操作。即:
如区域内无颜色,应能绘出指定颜色的class="tags" href="/tags/TuXing.html" title=图形>图形。
如区域内已存在指定颜色,异或操作后应擦去指定颜色的class="tags" href="/tags/TuXing.html" title=图形>图形
如区域内内已存在其它颜色,应绘制出该颜色和指定颜色进行异或操作后的新颜色的class="tags" href="/tags/TuXing.html" title=图形>图形。

可程序运行结果是:如果区域内无颜色,无法绘制出class="tags" href="/tags/TuXing.html" title=图形>图形.是不是我理解的有问题?
文档对setXORMode的说明是:

Sets the paint mode of this graphics context to alternate between this graphics context's current color and the new specified color
class="tags" href="/tags/TuXing.html" title=图形>图形上下文的绘图模式在其原有颜色与指定的新颜色间进行转换

也没有说当不存在原有颜色时就绘不出class="tags" href="/tags/TuXing.html" title=图形>图形来啊

---------------------------------------------------------
CoffeeMachine(TwoBeds)兄说的对的,我对javaclass="tags" href="/tags/TuXing.html" title=图形>图形也没怎么研究过,但是对setXormode的理解
和你稍微有点不同,我也认为setXormode可以搽去class="tags" href="/tags/TuXing.html" title=图形>图形,但是
g.setColor(Color.blue);
g.setXORMode(Color.blue);  
两句话每次都执行的话,蓝色和蓝色xor就没了,什么也显示不出来了,其实 xor是发生作用的,
但要有个开关变量,第一次让他不xor,第二次让他xor,把class="tags" href="/tags/TuXing.html" title=图形>图形就xor没了,
不信,你把setXormode(这里的颜色换成别的)你可以看到xor后的颜色既不是蓝也不是...
是两种颜色的叠加。


不知道对不对,请指教。
---------------------------------------
对的,xor能擦去相同颜色的class="tags" href="/tags/TuXing.html" title=图形>图形,能对不同颜色进行叠加。但似乎是绘图区已绘制某种颜色的情况下用xor才能画出class="tags" href="/tags/TuXing.html" title=图形>图形来。
记得以前学class="tags" href="/tags/DELPHI.html" title=delphi>delphi的时候用异或模式是能在未着色的区域上绘图的。执行一次绘出指定颜色class="tags" href="/tags/TuXing.html" title=图形>图形,再执行一次擦去,方便得很,java好象不太一样。是不是对未着色的区域进行异或操作时使用的“空”颜色是类似null的概念,任何值与之运算结果都是“空”,所以绘不出class="tags" href="/tags/TuXing.html" title=图形>图形?

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),绘图后明明会变成绿色,而不是指定的蓝色呀。这文档写的是不是有问题了?


http://www.niftyadmin.cn/n/1052519.html

相关文章

git ignore 忽略某些文件

git ignore 忽略某些文件 git已跟踪文件:git update-index --assume-unchanged filename *撤销忽略:git update-index --no-assume-unchanged filenamegit未跟踪文件:在仓库目录(与.git同级)下,新建一个.gitignore文件&#xff…

一、服务器控件

一、div 前台HTML&#xff1a;<div id"cate1" runat"server" style"display:block;"></div><div id"cate2" runat"server" style"display:none;"></div>后台cs文件为前台标签添加属性ca…

Java中的Bridge方法

今天在Java中字节码的格式的时候&#xff0c;发现method_info中的access_flags中竟然定了ACC_BRIDGE的值。网上搜了一下&#xff0c;大概理解它的意思了&#xff0c;先记之。首先是在什么情况下会生成bridge方法&#xff08;2&#xff09;&#xff1a;bridge method may be cre…

XENAPP单一服务器全功能解决方案-WI服务器

WI服务器的安装 添加角色 选择 Web Interface 角色 配置WEB interface 创建站点 选择站点类型XenAppWeb 设置为IIS默认站点 选择身份验证方式 开始创建站点 创建完成 添加服务器场 配置身份验证方法 转载于:https://blog.51cto.com/88asd/819314

applet 加载提示

<script language"JavaScript"><!-- Hide script from old browsers  function init(){   // Microsoft Internet Explorer   if (document.all){   document.all.loading.style.visibility"hidden";   document.all.myapplet.style.vis…

JS/jquery实现鼠标控制页面元素显隐

最近网站要上一个活动广告横幅&#xff0c;当用户鼠标划过时显隐二维码。像这种鼠标事件控制页面元素显隐的情况&#xff0c;码农们会经常遇到&#xff0c;可以通过javascript或jquery代码实现&#xff0c;下面就几种常见需求一起归纳一下。 mouseout和mouseleave 对于鼠标指针…

Linux下查看磁盘空间使用

1>df是以磁盘分区为单位来查看磁盘的使用情况&#xff1a; # df -lh Filesystem Size Used Avail Use% Mounted on /dev/mapper/VolGroup-lv_root 50G 14G 34G 30% / tmpfs 3.8G 0 3.8G 0% /dev/shm /dev/sda1 485M 32M 429M 7% /boot /dev/mapper/VolGroup-lv_home 42G 4.5…

android用于打开各种文件的intent

import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.net.Uri.Builder; import java.io.File; import android.content.Intent; //自定义android Intent类&#xff0c; //可用于获取打开以下文件的inte…