JavaFX Tooltip仅显示在指定Polygon上的实现问题
解决Tooltip仅在指定六边形Tile显示的问题
原代码的核心问题是把Tooltip绑定到了整个Pane容器上,导致鼠标在容器内任意位置都可能触发Tooltip逻辑。要实现仅在最后一个六边形Tile显示Tooltip,有两种简洁的修改方式:
方式一:直接给最后一个Tile安装Tooltip(推荐)
利用JavaFX Tooltip的默认hover行为,无需额外编写鼠标事件逻辑,直接将Tooltip绑定到目标Tile上即可:
package com.example.demo1; import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.Tooltip; import javafx.scene.layout.BorderPane; import javafx.scene.layout.Pane; import javafx.scene.paint.Color; import javafx.scene.shape.Polygon; import javafx.stage.Stage; public class HelloApplication extends Application { private final static int WINDOW_WIDTH = 800; private final static int WINDOW_HEIGHT = 600; private final static double r = 20; // 六边形中心到顶点的半径 private final static double n = Math.sqrt(r * r * 0.75); // 六边形中心到边中点的距离 private final static double TILE_HEIGHT = 2 * r; private final static double TILE_WIDTH = 2 * n; @Override public void start(Stage stage) { Pane tileMap = new Pane(); int rowCount = 4; // 行数 int tilesPerRow = 6; // 每行Tile数量 int xStartOffset = 40; // 整体水平偏移 int yStartOffset = 40; // 整体垂直偏移 Polygon tile = null; for (int x = 0; x < tilesPerRow; x++) { for (int y = 0; y < rowCount; y++) { double xCoord = x * TILE_WIDTH + (y % 2) * n + xStartOffset; double yCoord = y * TILE_HEIGHT * 0.75 + yStartOffset; tile = new Tile(xCoord, yCoord); tileMap.getChildren().add(tile); } } // 给最后一个Tile设置Tooltip final Polygon lastTile = tile; Tooltip tooltip = new Tooltip("test"); Tooltip.install(lastTile, tooltip); BorderPane pane = new BorderPane(); pane.setCenter(tileMap); Scene content = new Scene(pane, WINDOW_WIDTH, WINDOW_HEIGHT); stage.setScene(content); stage.show(); } private class Tile extends Polygon { Tile(double x, double y) { // 构建六边形顶点坐标 getPoints().addAll( x, y, x, y + r, x + n, y + r * 1.5, x + TILE_WIDTH, y + r, x + TILE_WIDTH, y, x + n, y - r * 0.5 ); // 设置Tile样式和点击事件 setFill(Color.ANTIQUEWHITE); setStrokeWidth(1); setStroke(Color.BLACK); setOnMouseClicked(e -> System.out.println("Clicked: " + this)); } } public static void main(String[] args) { launch(); } }
方式二:保留鼠标事件逻辑(按需选择)
如果需要自定义Tooltip的显示逻辑,可以将Tooltip绑定到最后一个Tile,并通过事件控制显示:
// 替换原代码中Tooltip相关的逻辑 final Polygon lastTile = tile; Tooltip tooltip = new Tooltip("test"); Tooltip.install(lastTile, tooltip); // 若需自定义显示逻辑,可添加如下事件(默认hover已满足需求时可省略) lastTile.addEventHandler(javafx.scene.input.MouseEvent.MOUSE_ENTERED, e -> tooltip.show(lastTile, e.getScreenX(), e.getScreenY())); lastTile.addEventHandler(javafx.scene.input.MouseEvent.MOUSE_EXITED, e -> tooltip.hide());
改动说明
- 移除了原代码中绑定到
Pane的Tooltip,改为绑定到目标lastTile - 利用Tooltip默认的hover行为,无需手动判断鼠标位置,逻辑更简洁可靠
- 若需自定义显示时机,可针对
lastTile添加鼠标进入/退出事件
内容的提问来源于stack exchange,提问作者SK19
相关产品推荐
相关产品推荐

