AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 79232678
Accepted
MuseumPiece
MuseumPiece
Asked: 2024-11-28 13:28:46 +0800 CST2024-11-28 13:28:46 +0800 CST 2024-11-28 13:28:46 +0800 CST

Javafx Scene 使用工具提示时获取节点

  • 772

我有一些代码可以根据 TreeTableView 中的 TreeTableRow 生成二维码。我使用以下代码在树表上附加了一个工具提示。工具提示运行良好,将鼠标悬停在行上时将显示“Hello World”二维码。但是,图像需要动态生成。

img 使用 io.nayuki.qrcodegen 生成如下,愿它们永远存在。



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 -> {// called just prior to being shown    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 在鼠标下找到节点”之外,没有太多内容。

从那时起,我找到了一种解决方法,即使用行工厂并将当前行存储在全局变量 hoverRow 中。

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

修改工具提示如下:

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

有效解决了,但是原来的问题关于如何找到鼠标下的节点仍然是一个谜。

javafx
  • 1 1 个回答
  • 30 Views

1 个回答

  • Voted
  1. Best Answer
    jewelsea
    2024-11-28T21:49:22+08:002024-11-28T21:49:22+08:00

    假设你的问题是:

    如何找到鼠标下的节点

    您可以从鼠标事件目标中确定当前拾取的节点,或者拾取结果 相交的节点。

    scene.addEventFilter(
            MouseEvent.MOUSE_MOVED, e ->
                    System.out.println(
                            "Picking: " + e.getTarget()
                    )
    );
    

    例子

    在示例中,文本将发生变化,以指示当前鼠标位置下的节点。

    事件过滤器会监控场景中的鼠标移动,并在属性中记录当前选中(或目标)的节点。订阅该属性将更新场景中的文本,并将选中节点的历史记录记录到控制台。

    由于鼠标监听器是针对场景中的鼠标移动设置的,因此,如果鼠标离开场景,当前拾取的节点将保持为最后拾取的节点。

    采摘

    WheresTheMouseAtApp.java

    import javafx.application.Application;
    import javafx.scene.Scene;
    import javafx.scene.layout.Background;
    import javafx.scene.layout.Pane;
    import javafx.scene.paint.Color;
    import javafx.scene.shape.Circle;
    import javafx.scene.shape.Rectangle;
    import javafx.scene.text.Font;
    import javafx.scene.text.Text;
    import javafx.stage.Stage;
    
    public class WheresTheMouseAtApp extends Application {
        private Text text;
    
        @Override
        public void start(Stage stage) throws Exception {
            Scene scene = createScene();
            stage.setScene(scene);
            stage.show();
    
            PickRecorder pickRecorder = new PickRecorder(scene);
            pickRecorder.currentPickedNodeProperty().subscribe(node -> {
                System.out.println("target " + node);
                String simpleNodeText =
                        node != null
                                ? node.getClass().getSimpleName()
                                : " nothing";
    
                text.setText("Picking " + simpleNodeText);
            });
        }
    
        private Scene createScene() {
            Rectangle square = new Rectangle(50, 50, 100, 100);
            square.setFill(Color.BLUE);
    
            Circle circle = new Circle(300,  100, 60);
            circle.setFill(Color.ORANGE);
    
            text = new Text(85, 225, null);
            text.setFont(Font.font(30));
    
            Pane pane = new Pane(square, circle, text);
            pane.setBackground(Background.fill(Color.AZURE));
    
            return new Scene(pane, 400, 300);
        }
    }
    

    PickRecorder.java

    import javafx.beans.property.ObjectProperty;
    import javafx.beans.property.SimpleObjectProperty;
    import javafx.scene.Node;
    import javafx.scene.Scene;
    import javafx.scene.input.PickResult;
    import javafx.scene.input.MouseEvent;
    
    class PickRecorder {
        private final ObjectProperty<Node> currentPickedNode = 
                new SimpleObjectProperty<>();
    
        public PickRecorder(Scene scene) {
            scene.addEventFilter(
                MouseEvent.MOUSE_MOVED, e ->
                    currentPickedNode.set(
                        // using either the picked node or target node will work.
                        getPickedNode(e)
                        // getTargetNode(e)
                    )
            );
        }
    
        private static Node getPickedNode(MouseEvent e) {
            PickResult pickResult = e.getPickResult();
    
            return
                    pickResult != null
                            ? pickResult.getIntersectedNode()
                            : null;
        }
    
        private static Node getTargetNode(MouseEvent e) {
            return e.getTarget() instanceof Node targetNode
                    ? targetNode
                    : null;
        }
    
        public ObjectProperty<Node> currentPickedNodeProperty() {
            return currentPickedNode;
        }
    }
    
    • 1

相关问题

  • 如何从字节数组在 javafx 中创建 Media 对象?

  • Node.snapshot() 在 JavaFX 中看不到节点的变化

  • JavaFX 场景 minWidth 和 minHeight 不起作用

  • 如何使 Togglebutton 在 tableView 列中正常工作?

  • Javafx ListView 遇到问题

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    Vue 3:创建时出错“预期标识符但发现‘导入’”[重复]

    • 1 个回答
  • Marko Smith

    为什么这个简单而小的 Java 代码在所有 Graal JVM 上的运行速度都快 30 倍,但在任何 Oracle JVM 上却不行?

    • 1 个回答
  • Marko Smith

    具有指定基础类型但没有枚举器的“枚举类”的用途是什么?

    • 1 个回答
  • Marko Smith

    如何修复未手动导入的模块的 MODULE_NOT_FOUND 错误?

    • 6 个回答
  • Marko Smith

    `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它?

    • 3 个回答
  • Marko Smith

    何时应使用 std::inplace_vector 而不是 std::vector?

    • 3 个回答
  • Marko Smith

    在 C++ 中,一个不执行任何操作的空程序需要 204KB 的堆,但在 C 中则不需要

    • 1 个回答
  • Marko Smith

    PowerBI 目前与 BigQuery 不兼容:Simba 驱动程序与 Windows 更新有关

    • 2 个回答
  • Marko Smith

    AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String”

    • 1 个回答
  • Marko Smith

    我正在尝试仅使用海龟随机和数学模块来制作吃豆人游戏

    • 1 个回答
  • Martin Hope
    Aleksandr Dubinsky 为什么 InetAddress 上的 switch 模式匹配会失败,并出现“未涵盖所有可能的输入值”? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge 为什么这个简单而小的 Java 代码在所有 Graal JVM 上的运行速度都快 30 倍,但在任何 Oracle JVM 上却不行? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini 具有指定基础类型但没有枚举器的“枚举类”的用途是什么? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer 何时应使用 std::inplace_vector 而不是 std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller 在 5.2 版中,bash 条件语句中的 [[ .. ]] 中的分号现在是可选的吗? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench 为什么双破折号 (--) 会导致此 MariaDB 子句评估为 true? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng 为什么 `dict(id=1, **{'id': 2})` 有时会引发 `KeyError: 'id'` 而不是 TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String” 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB 为什么 GCC 生成有条件执行 SIMD 实现的代码? 2024-02-17 06:17:14 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve