
本文旨在解决 JavaFX 8 应用中实现全屏缩放时遇到的 `BorderPane` 重复添加子节点的问题。通过分析错误原因和提供正确的代码示例,帮助开发者避免类似错误,并实现期望的全屏缩放效果。文章重点在于理清 `BorderPane` 的使用方式,并提供清晰的布局策略。
在 JavaFX 应用开发中,实现全屏缩放功能是常见的需求。然而,在实现过程中,开发者可能会遇到各种问题,例如 BorderPane 重复添加子节点导致的异常。本文将针对这一问题进行详细分析,并提供解决方案。
问题分析
错误信息 duplicate children added: parent = BorderPane 表明,在代码中,inputBar 被重复添加到了 root (一个 BorderPane 实例) 中。查看代码:
this.root = new BorderPane();// . . .root.getChildren().addAll( console, scroll, inputBar);root.setBottom(inputBar);
inputBar 首先通过 root.getChildren().addAll() 添加到 BorderPane 中,然后又通过 root.setBottom(inputBar) 添加到 BorderPane 的底部区域。这导致了重复添加,从而引发异常。
立即学习“Java免费学习笔记(深入)”;
解决方案
BorderPane 是一种布局容器,它将子节点放置在五个区域:顶部 (Top)、底部 (Bottom)、左侧 (Left)、右侧 (Right) 和中心 (Center)。正确使用 BorderPane 的方式是使用其提供的 setTop()、setBottom()、setLeft()、setRight() 和 setCenter() 方法来设置子节点的位置,而不是直接使用 getChildren().addAll()。
因此,修改后的代码应该如下:
this.root = new BorderPane();root.setCenter(scroll); // 将 scroll 放在中心区域root.setBottom(inputBar); // 将 inputBar 放在底部区域
在这个修改后的代码中,console 被放置在 ScrollPane 中,而 scroll 被放置在 BorderPane 的中心区域。inputBar 被放置在 BorderPane 的底部区域。这样就避免了重复添加子节点的问题。
代码示例
下面是修改后的 Console 类的代码示例:
package application.console;import java.util.List;import application.areas.startingArea.SA;import application.areas.vanguardForest.VFCmds;import application.areas.vanguardForest.VFNavi;import application.areas.vanguardForest.VFPkups;import javafx.beans.value.ChangeListener;import javafx.beans.value.ObservableValue;import javafx.scene.control.ScrollPane;import javafx.scene.control.TextField;import javafx.scene.control.ScrollPane.ScrollBarPolicy;import javafx.scene.layout.Background;import javafx.scene.layout.BackgroundFill;import javafx.scene.layout.BorderPane;import javafx.scene.layout.HBox;import javafx.scene.layout.Region;import javafx.scene.layout.VBox;import javafx.scene.paint.Color;import javafx.scene.text.Font;import javafx.scene.text.Text;public class Console extends Region { public static double WIDTH = 990; public static double HEIGHT = 525; private final Font cinzel; private final BorderPane root; private final VBox console; private final ScrollPane scroll; private final HBox inputBar; private final TextField input; private final Text carrot; public Console() { this.root = new BorderPane(); root.setStyle("-fx-background-color: #232323;"); this.cinzel = Font.loadFont("file:fonts/static/Cinzel-Medium.ttf", 16); this.console = new VBox(); console.setPrefWidth(WIDTH); console.setPrefHeight(HEIGHT); this.scroll = new ScrollPane(); scroll.setContent(console); scroll.setStyle("-fx-background: #232323;" + "-fx-background-color: transparent;" + "-fx-border-color: #232323;" + "-fx-focus-color: #232323;"); scroll.setHbarPolicy(ScrollBarPolicy.NEVER); scroll.setVbarPolicy(ScrollBarPolicy.NEVER); scroll.setBackground(new Background(new BackgroundFill(Color.TRANSPARENT, null, null))); console.setStyle("-fx-background-color: #232323;" + "-fx-focus-color: #232323;"); console.heightProperty().addListener(new ChangeListener
总结与注意事项
正确使用 BorderPane: 使用 setTop()、setBottom()、setLeft()、setRight() 和 setCenter() 方法来设置子节点的位置,避免直接操作 getChildren() 列表。避免重复添加: 仔细检查代码,确保没有将同一个节点多次添加到同一个容器中。理解布局原理: 深入理解 JavaFX 布局容器的工作原理,有助于避免类似错误,并更好地控制应用的界面布局。全屏缩放实现: 示例代码中已经包含了layoutChildren()方法,通过计算缩放比例,对各个组件进行缩放和居中,实现了基本的全屏缩放功能。
通过遵循这些建议,开发者可以避免 BorderPane 重复添加子节点的问题,并构建出稳定、可靠的 JavaFX 应用。
以上就是JavaFX 8 全屏缩放应用:解决 BorderPane 重复添加子节点问题的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/18021.html
微信扫一扫
支付宝扫一扫