java画图的问题

olympicjc 2012-03-22 03:13:50
共有四个文件
文件一: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());
}
}



文件二:MyApplet.java

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);
}

}



文件三:Basic.java

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);
}
}



文件四:main.java

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重合,重合部分均不变色
请问这是怎么回事呢?我写的代码哪里有问题?请各位大虾不吝赐教
...全文
157 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
olympicjc 2012-03-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 dntg007 的回复:]

你说一个问题,你的程序在退出重合状态时下有时候不能恢复其原来的背景颜色,红色。
在"// 重合区域变色"前重置一下颜色就可以解决
Graphics pen = com.getGraphics();
pen.setColor(background);
pen.fillRect(0, 0, 50, 50);
这……
[/Quote]
对对对,就是真个原因,谢谢啦!
dntg007 2012-03-22
  • 打赏
  • 举报
回复
你说一个问题,你的程序在退出重合状态时下有时候不能恢复其原来的背景颜色,红色。
在"// 重合区域变色"前重置一下颜色就可以解决
Graphics pen = com.getGraphics();
pen.setColor(background);
pen.fillRect(0, 0, 50, 50);
这样改的话别忘了下面的pen不用重新定义了。那行代码要删除掉。
至于你说的移动2重合1时不能变色,我猜测可能是顺序问题。因为1是顺序最高,所以你虽然把2的重合部分变色了。但是1的所有区域颜色还是红色。而1可能默认会覆盖2的东西。建议你在给重合区域变色时,2个组件的
重合部分都变色。
olympicjc 2012-03-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dracularking 的回复:]

這裡應該有問題吧
public void mouseReleased(MouseEvent e) {
mouseX = 0;
mouseY = 0;
}
放鼠標后怎麼就0了呢

還有封裝粒度應該控制在矩形對象層級,一切活動都是面向對象為單位主體
方便控制與理解,這樣自然就應該有一個計算本矩形對象與其它矩形重疊多少的方……
[/Quote]
mouseX和mouseY指的是鼠标按下时的位置,松开鼠标后,将其置0程序整体没有影响。
我的程序写的有点儿槽,没把方法分离出来,不过跟这个似乎没啥关系哦。
olympicjc 2012-03-22
  • 打赏
  • 举报
回复
回1楼:
mouseX和mouseY指的是鼠标按下时的位置,松开鼠标后,将其置0程序整体没有影响。
我的程序写的有点儿槽,没把方法分离出来,不过跟这个似乎没啥关系哦。
dracularking 2012-03-22
  • 打赏
  • 举报
回复
這裡應該有問題吧
public void mouseReleased(MouseEvent e) {
mouseX = 0;
mouseY = 0;
}
放鼠標后怎麼就0了呢

還有封裝粒度應該控制在矩形對象層級,一切活動都是面向對象為單位主體
方便控制與理解,這樣自然就應該有一個計算本矩形對象與其它矩形重疊多少的方法

51,409

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧