JavaFX 如何在节点上居中显示工具提示?

我目前正在研究一种表单,该表单在将焦点从一个节点更改为另一个节点时进行验证,并希望在包含错误的节点上方显示一个工具提示(如果存在)。我正在使用工具提示的show(Node ownerNode, double anchorX, double anchorY)方法签名来指定我想将它附加到哪个节点以及放置它的位置。


我试过以下代码:


Tooltip tooltip = new Tooltip("Error"); 

tooltip.show(node, 0, 0);

double tooltipMiddle = tooltip.getWidth() / 2;

tooltip.hide(); 

double nodeMiddle = node.getWidth() / 2; 


//Gets the node's x and y position within the window

Bounds bounds = node.localToScene(node.getBoundsInLocal());  


//Tooltip's bottom-right corner is set to the anchor points, so I set x to

//the node's x coordinate plus half the width of the node plus half the width

//of the tooltip 

tooltip.show(node,

             bounds.getMinX() + nodeMiddle + tooltipMiddle, bounds.getMinY());

这让我非常接近中心,但它仍然关闭。我一直在互联网上寻求帮助,但我只是没有找到任何帮助,所以我想我会在这里问。

有没有机会我可以深入了解为什么我无法按照自己的意愿进行工作?

http://img1.mukewang.com/626a4560000184ce03150092.jpg

慕码人8056858
浏览 147回答 2
2回答

呼啦一阵风

我带来的代码提供了工具提示的正确定位,但远非完美。带来全面的解决方案需要大量工作(如果您愿意,我们可以讨论)。我认为你有一个数学问题,并且Tooltip类可能不是最好的选择。import javafx.application.Application;import javafx.geometry.Bounds;import javafx.scene.Scene;import javafx.scene.control.Button;import javafx.scene.control.Label;import javafx.scene.control.TextField;import javafx.scene.layout.HBox;import javafx.scene.layout.Pane;import javafx.scene.layout.Region;import javafx.scene.layout.StackPane;import javafx.stage.Stage;public class TooltipApp extends Application {    public static void main(String[] args) {        launch(args);    }    @Override    public void start(Stage stage) throws Exception {        TextField textField = new TextField();        textField.setPrefWidth(100.);        Button button = new Button("Tooltip");        HBox hBox = new HBox(textField, button);        hBox.setMaxSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE);        Label label = new Label("Empty!");        label.setVisible(false);        Pane tooltipPane = new Pane(label);        tooltipPane.setMouseTransparent(true);        StackPane stackPane = new StackPane(hBox, tooltipPane);        stackPane.setPrefSize(600., 400.);        Scene scene = new Scene(stackPane);        stage.setScene(scene);        stage.show();        button.setOnMouseClicked(event -> {            if (label.isVisible()) {                label.setVisible(false);            } else {                Bounds sceneBounds = textField.localToScene(textField.getBoundsInLocal());                label.setLayoutX((sceneBounds.getMinX() + (sceneBounds.getWidth() / 2)) - (label.getWidth() / 2));                label.setLayoutY(sceneBounds.getMinY() - label.getHeight());                label.setVisible(true);            }        });    }}

弑天下

首先,您应该使用Bounds bounds = node.localToScreen(node.getBoundsInLocal());,因为可能不清楚相关Scene内容是什么。然后调用tooltip.show(node, bounds.getMinX(), bounds.getMinY());应该给你一个工具提示,其左上角与节点的左上角相同。现在,tooltip.show(node, bounds.getMinX() + nodeMiddle - tooltipMiddle, bounds.getMinY() - tooltipHeight);应该产生所需的结果,它确实适用于double tooltipMiddle = (tooltip.getWidth()-18) / 2;double tooltipHeight = tooltip.getHeight()-18;double nodeMiddle = getWidth() / 2;18 来自一个小实验,我不确定为什么宽度和高度会偏离那个数量,但它似乎与工具提示中文本的长度或行数无关。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java