JavaFX全屏时TextField与VBox宽度不更新问题求助
解决JavaFX全屏时TextField宽度与文本换行宽度无法动态更新的问题
问题根源在于使用了静态常量WIDTH固定元素宽度,没有将元素宽度与容器的动态宽度属性绑定,导致窗口切换全屏时,内部元素无法自动适配新的宽度。以下是具体修复方案:
1. 移除静态宽度常量,让容器自动适配父空间
首先去掉Ce类中固定的静态宽度/高度常量,JavaFX布局容器(如BorderPane)默认会自动填充父容器空间,无需硬编码固定值:
// 移除这两行静态常量 // public static double WIDTH = 990; // public static double HEIGHT = 525;
同时删除root.setMinSize(WIDTH, (HEIGHT - input.getHeight()));这句硬编码的尺寸设置,让BorderPane自动适应窗口大小。
2. 让TextField占满底部HBox的剩余宽度
修改底部HBox和TextField的配置,让TextField自动填充HBox的剩余空间:
HBox hbox = new HBox(); // 去掉固定prefSize,让HBox自动占满BorderPane底部宽度 // hbox.setPrefSize(WIDTH, 16); root.setBottom(hbox); // ... 其他carrot相关代码 ... // 移除固定minWidth设置 // input.setMinWidth(console.getWidth()); // 添加Hgrow优先级,让TextField占满HBox剩余空间 HBox.setHgrow(input, Priority.ALWAYS);
3. 绑定控制台VBox的宽度到ScrollPane视口宽度
让console这个VBox的宽度跟随ScrollPane的视口宽度变化,确保内部文本容器能适配宽度:
// 在scroll.setContent(console);之后添加绑定 console.prefWidthProperty().bind(scroll.viewportBoundsProperty().map(bounds -> bounds.getWidth()));
4. 修复print方法中的文本容器与换行宽度
修改print方法,让文本容器和换行宽度动态绑定到console的宽度,不再依赖静态常量:
@SuppressWarnings("static-access") public void print(String s, Color c) { Ce Ce = new Ce(); HBox text1 = new HBox(); // 移除固定宽度设置,绑定到console宽度 // text1.setMinWidth(Ce.WIDTH); // text1.setMaxWidth(Ce.WIDTH); text1.prefWidthProperty().bind(Ce.console.widthProperty()); // ... tCarrot相关代码 ... Text text2 = new Text(); // ... 打字机效果代码 ... // 移除固定wrappingWidth,绑定到console宽度减去偏移量 // text2.setWrappingWidth(Ce.WIDTH - 40); text2.wrappingWidthProperty().bind(Ce.console.widthProperty().subtract(40)); // ... 其他添加子元素代码 ... }
额外优化:监听窗口全屏状态(可选)
如果需要在全屏切换时做额外调整,可以在主类中监听Stage的全屏属性:
stage.fullScreenProperty().addListener((obs, oldVal, newVal) -> { // 全屏切换时的额外逻辑,比如调整字体大小等 });
完成以上修改后,窗口切换全屏时,TextField的宽度会自动填充底部空间,文本的换行宽度也会随控制台宽度动态更新,解决显示异常问题。
内容的提问来源于stack exchange,提问作者Providence
相关产品推荐
相关产品推荐

