如何根据JavaFX 8中的特定祖先获取节点边界?
发布时间:2020-12-15 02:59:10 所属栏目:Java 来源:网络整理
导读:我在AnchorPane中添加了一个图表,我想得到它的图表的边界(图表图,我用青色标记它),这样我就可以在它上面添加一些文本,但我应该知道它的确切根据其祖先的界限.如果我手动执行,我可能会在调整大小等时更改节点的填充大小时失败. import javafx.application.App
我在AnchorPane中添加了一个图表,我想得到它的图表的边界(图表图,我用青色标记它),这样我就可以在它上面添加一些文本,但我应该知道它的确切根据其祖先的界限.如果我手动执行,我可能会在调整大小等时更改节点的填充大小时失败.
import javafx.application.Application; import javafx.geometry.Side; import javafx.scene.Node; import javafx.scene.Scene; import javafx.scene.chart.LineChart; import javafx.scene.chart.NumberAxis; import javafx.scene.layout.AnchorPane; import javafx.stage.Stage; public class Main extends Application { @Override public void start(Stage primaryStage) throws Exception { NumberAxis numberAxis = new NumberAxis(); LineChart chart = new LineChart(numberAxis,new NumberAxis()); chart.getYAxis().setSide(Side.RIGHT); Node chartPlotArea = chart.lookup(".chart-plot-background"); chartPlotArea.setStyle("-fx-background-color: cyan"); AnchorPane anchorPane = new AnchorPane(chart); AnchorPane.setTopAnchor(chart,0.0); AnchorPane.setRightAnchor(chart,0.0); AnchorPane.setBottomAnchor(chart,0.0); AnchorPane.setLeftAnchor(chart,0.0); Scene scene = new Scene(anchorPane); primaryStage.setScene(scene); primaryStage.setMaximized(true); primaryStage.show(); } } 所以问题是如何在我的情况下根据它的祖先获得节点或图表的界限,无论有多少? 解决方法
您已经找到了Chart-Plot背景节点,并根据其祖先需要简单地调用它来获取坐标
chartPlotArea.getBoundsInParent(); 如果它们之间有多个祖先,你可以获得char-plot界限 Bounds bounds = anchorPane.sceneToLocal(chartPlotArea.localToScene(chartPlotArea.getBoundsInLocal())); 这里的一个小技巧是,它们将为0,直到你显示阶段并让javaFX布局节点,所以你需要在.show()方法后更新它,所以结果可能如下所示: NumberAxis numberAxis = new NumberAxis(); LineChart chart = new LineChart(numberAxis,new NumberAxis()); chart.getYAxis().setSide(Side.RIGHT); Node chartPlotArea = chart.lookup(".chart-plot-background"); chartPlotArea.setStyle("-fx-background-color: cyan"); Text text = new Text(); text.setText("Text"); AnchorPane anchorPane = new AnchorPane(); AnchorPane.setTopAnchor(chart,0.0); AnchorPane.setRightAnchor(chart,0.0); AnchorPane.setBottomAnchor(chart,0.0); AnchorPane.setLeftAnchor(chart,0.0); anchorPane.getChildren().addAll(chart,text); Scene scene = new Scene(anchorPane); primaryStage.setScene(scene); primaryStage.setMaximized(true); primaryStage.show(); Bounds bounds = anchorPane.sceneToLocal(chartPlotArea.localToScene(chartPlotArea.getBoundsInLocal())); double textRelativeX = (bounds.getMinX() + bounds.getMaxX()) / 2 - text.getLayoutBounds().getWidth() / 2; double textRelativeY = bounds.getMinY() - text.getLayoutBounds().getHeight() / 2; AnchorPane.setLeftAnchor(text,textRelativeX); AnchorPane.setTopAnchor(text,textRelativeY); 请记住,如果您想在调整大小时更改坐标,可以将其绑定到图表或chartPlotArea绑定/宽度更改,这样的事情 chart.layoutBoundsProperty().addListener((observable,oldValue,newValue) -> { double textRelativeXz = (newValue.getMinX() + newValue.getMaxX()) / 2 - text.getLayoutBounds().getWidth() / 2; double textRelativeYz = newValue.getMinY() - text.getLayoutBounds().getHeight() / 3; AnchorPane.setLeftAnchor(text,textRelativeXz); AnchorPane.setTopAnchor(text,textRelativeYz); }); 编辑:如果你有一个以上的祖先,你可以这样做,以接收anchorPane坐标系中的char-plot界限 Bounds bounds = anchorPane.sceneToLocal(chartPlotArea.localToScene(chartPlotArea.getBoundsInLocal())); 即使它们之间存在多个祖先,这也会起作用 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- java spring boot 导出/下载文本文件操作(包含写文本文件)
- java – Eclipse中注释声明的托管bean和代码完成Inidigo
- java – 使用GridBagLayout Manager将页面右上角的组件对齐
- java – 为BST实现equals和hashcode
- java – 如何使用hibernate / jpa注释将一个类映射到不同的
- 在Java中对对象列表进行排序的最优雅方法是什么?
- java – 自我比较接口在Collections Class中做了什么?
- Android 开机自启动代码
- SpringBoot整合UEditor的示例代码
- 读取 android 设备的电池信息