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

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());

改动说明

  1. 移除了原代码中绑定到Pane的Tooltip,改为绑定到目标lastTile
  2. 利用Tooltip默认的hover行为,无需手动判断鼠标位置,逻辑更简洁可靠
  3. 若需自定义显示时机,可针对lastTile添加鼠标进入/退出事件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 14:49:51