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

非JComponent组件(Ellipse)的ToolTip功能失效问题排查

解决Java Swing坐标点ToolTip不显示的问题

你的ToolTip不生效核心是坐标匹配错误,加上几个必要环节没做,以下是具体解决步骤:

1. 修正坐标匹配逻辑

你绘制坐标点时对原始坐标做了缩放+偏移+Y轴翻转:

int x = (int) Math.round(coordinates.get(i).getPoint().x * X_SCALING) + originX;
int y = (int) Math.round(coordinates.get(i).getPoint().y * -1 * Y_SCALING) + originY;

但Coordinate类继承Ellipse2D.Double时用的是原始未转换的坐标,导致coordinate.contains(event.getPoint())拿原始坐标和鼠标的屏幕坐标直接对比,完全匹配不上。

解决方式:修改Coordinate类,添加屏幕坐标判断方法

public class Coordinate extends Ellipse2D.Double {
    private Point point;
    private String name;
    private int radius;

    public Coordinate(Point point, String name, int radius) {
        super(point.getX(), point.getY(), radius, radius);
        this.point = point;
        this.name = name;
        this.radius = radius;
    }

    // 新增:判断鼠标屏幕坐标是否落在当前点的绘制区域内
    public boolean isMouseOver(Point mousePoint, double xScaling, double yScaling, int originX, int originY) {
        // 将屏幕坐标转换回原始坐标体系
        double originalX = (mousePoint.x - originX) / xScaling;
        double originalY = (originY - mousePoint.y) / yScaling; // 还原Y轴翻转
        return this.contains(originalX, originalY);
    }

    // 重写toString,返回要显示的ToolTip内容
    @Override
    public String toString() {
        return String.format("坐标:(%d, %d),名称:%s", 
                            (int)point.getX(), (int)point.getY(), name);
    }
}

然后修改Grid类的getToolTipText方法:

@Override
public String getToolTipText(MouseEvent event) {
    Point mousePoint = event.getPoint();
    for (Coordinate coordinate : coordinates) {
        // 传入绘制时用的缩放/偏移参数,判断鼠标是否在点上
        if (coordinate.isMouseOver(mousePoint, X_SCALING, Y_SCALING, originX, originY)) {
            return coordinate.toString();
        }
    }
    return null;
}

2. 删除冗余代码

删掉drawCoordinates循环里的setToolTipText(coordinates.get(i).toString())——这行代码循环结束后只会保留最后一个点的提示,而且会被你重写的getToolTipText(MouseEvent)覆盖,完全没用。

3. 启用组件的ToolTip机制

Swing组件默认不会主动激活ToolTip,需要在Grid类的构造方法里添加一行代码:

public Grid() {
    // 其他初始化代码
    setToolTipText(""); // 设置空字符串触发ToolTip机制
}

额外检查项

  • 确保X_SCALING、Y_SCALING、originX、originY在getToolTipText调用时是正确的,没有被中途修改;
  • 确认coordinates集合不为空,且每个Coordinate对象的参数都正确。

内容的提问来源于stack exchange,提问作者mgwqiwdd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 23:50:44