java画图的问题
共有四个文件
文件一:MoveBaseComponents.java
import java.awt.*;import java.awt.event.*;public class MoveBaseComponents extends Canvas { static private int x; // 中间变量之横坐标 static private int y; // 中间变量之纵坐标 static private int mouseX; // 鼠标按键横坐标 static private int mouseY; // 鼠标按键纵坐标 static private Point point; // 组件位置 static private Color background = Color.red; // 组件背景颜色 MoveBaseComponents() { addMouseListener(new Move()); addMouseMotionListener(new Move()); point = new Point(100, 100); // position(); setBackground(background); setBounds(50, 50, 50, 50); } // 组件定位 public void position() { setLocation(point); // repaint(); } class Move extends MouseAdapter { public void mousePressed(MouseEvent e) { mouseX = e.getX(); mouseY = e.getY(); } public void mouseReleased(MouseEvent e) { mouseX = 0; mouseY = 0; } public void mouseDragged(MouseEvent e) { Component com = (Component) e.getSource(); x = com.getX() + e.getX() - mouseX; y = com.getY() + e.getY() - mouseY; // 需要做边界限定 point.setLocation(x, y); position(); // 重合区域变色 Rectangle rectSource = com.getBounds(); Rectangle rectDesc = null; for (Object obj : Basic.vector) { if (e.getSource() == obj) { continue; // 消除点击后本控件着色 } rectDesc = ((Component) obj).getBounds(); if (rectSource.intersects(rectDesc)) { Rectangle good = rectSource.intersection(rectDesc);//重合区域 // 新建重合部分 Graphics pen = com.getGraphics(); pen.setColor(Color.green); pen.fillRect(good.x - rectSource.x, good.y - rectSource.y, good.width, good.height);// System.out.println((good.x - rectSource.x) + "," + (good.y - rectSource.y) + "," + good.width + "," + good.height);// System.out.println(com);// System.out.println(pen); } } } } public void mouseMoved(MouseEvent e) { // System.out.println("move = " + e.getSource()); }}
import java.applet.Applet;import java.awt.Component;public class MyApplet extends Applet { @Override public Component add(Component comp) { Basic.add(comp); super.add(comp); return comp; } @Override public void remove(Component comp) { Basic.remove(comp); super.remove(comp); }}
import java.util.Vector;public class Basic { public static Vector vector = new Vector(); public static void add(Object obj) { vector.add(obj); } public static void remove(Object obj) { vector.remove(obj); }}
public class main extends MyApplet { MoveBaseComponents[] aa = {new MoveBaseComponents(), new MoveBaseComponents(),new MoveBaseComponents(),new MoveBaseComponents()}; public void init() { for(int i=0 ; i<aa.length ; i++){ add(aa[i]); } }}
当一个矩形与另一个矩形有重合部分时,重合部分会变成绿色(我是在拖拽的矩形上画图)
不过,如果把矩形依次命名为1、2、3、4,拖拽矩形1与2、3、4重合时,重合部分为绿色;拖拽2与3、4重合时,重合部分为绿色,而与1重合部分不变色;依次类推,拖拽4与1、2、3重合,重合部分均不变色
请问这是怎么回事呢?我写的代码哪里有问题?请各位大虾不吝赐教
[解决办法]
你说一个问题,你的程序在退出重合状态时下有时候不能恢复其原来的背景颜色,红色。
在"// 重合区域变色"前重置一下颜色就可以解决
Graphics pen = com.getGraphics();
pen.setColor(background);
pen.fillRect(0, 0, 50, 50);
这样改的话别忘了下面的pen不用重新定义了。那行代码要删除掉。
至于你说的移动2重合1时不能变色,我猜测可能是顺序问题。因为1是顺序最高,所以你虽然把2的重合部分变色了。但是1的所有区域颜色还是红色。而1可能默认会覆盖2的东西。建议你在给重合区域变色时,2个组件的
重合部分都变色。