You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 23:15:08