CS106A Java学习:GCompound对象鼠标事件失效及坐标偏移问题
问题1:GCompound交互故障解答
GCompound完全可以作为整体响应鼠标交互,你的代码问题出在GFace类缺失关键配置,和运行环境无关。
你当前的GFace构造函数仅将所有子图形添加到了GCompound容器中,没有显式设置GCompound自身的宽高。ACM图形库的GCompound默认不会自动根据子元素范围计算自身尺寸,缺失该配置会导致getElementAt()方法无法识别GCompound的点击区域,所以点击后返回null,无法触发拖拽逻辑。
如果需要点击头像的非边框区域也能被识别,可以额外给head设置填充属性。
修复代码片段如下:
public GFace (double width, double height){ head = new GOval (width, height); // 可选配置:设置头部填充,整个头像区域都可点击 head.setFilled(true); head.setFillColor(Color.WHITE); // 原有的子元素初始化、add逻辑保留不变 leftEye = new GOval (EYE_WIDTH * width, EYE_HEIGHT * height); rightEye = new GOval (EYE_WIDTH * width, EYE_HEIGHT * height); nose = createNose (NOSE_WIDTH * width, NOSE_HEIGHT * height); mouth = new GRect(MOUTH_WIDTH * width, MOUTH_HEIGHT * height); add(head, 0, 0); add(leftEye, 0.25 * width - EYE_WIDTH * width / 2, 0.25 * height - EYE_HEIGHT * height / 2); add(rightEye, 0.75 * width - EYE_WIDTH * width / 2, 0.25 * height - EYE_HEIGHT * height / 2); add(nose, 0.50 * width, 0.50 * height); add(mouth, 0.50 * width - MOUTH_WIDTH * width / 2, 0.75 * height - MOUTH_HEIGHT * height / 2); // 必须添加:设置GCompound自身尺寸 setSize(width, height); }
问题2:坐标翻倍偏移解答
该问题和交互故障是同一个根因导致的:GCompound未设置自身尺寸时,坐标映射逻辑会紊乱。
当你调用add(face, x1, y1)添加GFace时,系统会错误地将子元素的偏移量叠加到你传入的x1/y1坐标上,最终表现为整体位置是你预期坐标的两倍。只要按照问题1的修复方法添加setSize(width, height)配置,坐标偏移问题会同步解决。
内容的提问来源于stack exchange,提问作者fenglw
相关产品推荐
相关产品推荐

