非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
相关产品推荐
相关产品推荐

