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

JavaFX使用Tooltip时,如何获取鼠标下方的Node?

JavaFX中TreeTableView行悬浮显示动态二维码及鼠标下方Node获取疑问

我需要给TreeTableView的行实现一个功能:鼠标悬停在行上时,显示该行对应数据生成的二维码Tooltip。

初始静态实现

最初我通过io.nayuki.qrcodegen生成静态二维码图片,给TreeTableView绑定Tooltip,代码如下:

// 生成静态二维码图片
QrCode qr0 = QrCode.encodeText("Hello, world!", QrCode.Ecc.MEDIUM);
BufferedImage img = toImage(qr0, 2, 1, 0xFFFFFF,0x000000); 
Tooltip tp = new Tooltip();
Tooltip.install(treeTableView, tp);
tp.setOnShowing(ev -> {
    // 获取鼠标位置并转换为TreeTableView本地坐标
    Point mouse = java.awt.MouseInfo.getPointerInfo().getLocation();
    Point2D local = treeTableView.screenToLocal(mouse.x, mouse.y);
    ImageView iv1 = new ImageView();
    iv1.setImage(SwingFXUtils.toFXImage(img, null));
    tp.setGraphic(iv1);
});

但这个实现只能显示固定内容的二维码,无法根据当前悬停的行动态生成。

基于全局变量的动态实现方案

我尝试搜索“Javafx find the node under the mouse”但没找到有效方案,最后通过行工厂给每行绑定鼠标进出事件,将当前悬停行存储到全局变量hoverRow:

row.setOnMouseEntered(event->{
    StockBinsTree.this.hoverRow=row;
});
row.setOnMouseExited(event->{
    StockBinsTree.this.hoverRow=null;
});

然后修改Tooltip的显示逻辑,通过hoverRow获取当前行数据,动态生成对应二维码:

tp.setOnShowing(ev -> {
    if(hoverRow!=null) {
       StockBin sbItem = hoverRow.getItem();
       QrCode qr0 = QrCode.encodeText(sbItem.toLink(), QrCode.Ecc.HIGH);
       BufferedImage img = toImage(qr0, 2, 2, 0xFFFFFF,0x000000);
       ImageView iv1 = new ImageView();
       iv1.setImage(SwingFXUtils.toFXImage(img, null));
       tp.setGraphic(iv1);
    }
});

这个方案已经解决了动态生成二维码的问题,但我想了解:在JavaFX中,有没有办法直接获取鼠标下方的Node?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 23:52:37