You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让JavaFX的TextArea填充屏幕中央区域?

解决JavaFX中TextArea无法填充屏幕中央的问题

嘿,我来帮你捋捋这个问题~你现在遇到的TextArea缩在顶部、没法正常填充中央区域的情况,根源出在你用了VBox包裹BorderPane,却没给BorderPane设置正确的布局约束。咱们一步步来搞定:

问题根源

VBox的默认布局逻辑是让子节点只占用自身所需的最小空间,而BorderPane默认的首选高度就是它内容的总高度(也就是顶部菜单栏加上TextArea的初始高度)。所以当你把BorderPane放进VBox里时,它不会自动撑满整个Scene的空间,自然TextArea就只能缩在顶部了。

解决方案

我给你两种可行的办法,你可以根据自己的实际需求选:

方法1:直接用BorderPane作为Scene的根节点

既然你已经用BorderPane来规划菜单和TextArea的布局,完全可以去掉多余的VBox,直接把BorderPane设为Scene的根。这样BorderPane会自动占满整个Scene的空间,中央的TextArea也会自动拉伸填满菜单栏下方的剩余区域:

primaryStage.setTitle("Cauldron");
BorderPane borderPane = new BorderPane();

MenuBar menuBar = new MenuBar();
Menu menuFile = new Menu("File");
Menu menuEdit = new Menu("Edit");
Menu menuView = new Menu("View");
Menu menuHelp = new Menu("Help");
menuBar.getMenus().addAll(menuFile, menuEdit, menuView, menuHelp);
borderPane.setTop(menuBar);

TextArea textArea = new TextArea();
// 按需设置初始列数,数值基于默认字体的字符宽度计算
textArea.setPrefColumnCount(80);
borderPane.setCenter(textArea);

// 直接将BorderPane作为Scene的根节点
Scene scene = new Scene(borderPane, 1280, 720);
primaryStage.setScene(scene);
primaryStage.show();

方法2:保留VBox,给BorderPane设置垂直拉伸约束

如果你因为其他需求必须保留VBox,那一定要给BorderPane加上垂直拉伸的约束,让它占满VBox的所有垂直空间:

primaryStage.setTitle("Cauldron");
VBox root = new VBox();
Scene scene = new Scene(root, 1280, 720);

BorderPane borderPane = new BorderPane();
// 关键设置:让BorderPane在VBox中垂直方向自动拉伸占满空间
VBox.setVgrow(borderPane, Priority.ALWAYS);

MenuBar menuBar = new MenuBar();
Menu menuFile = new Menu("File");
Menu menuEdit = new Menu("Edit");
Menu menuView = new Menu("View");
Menu menuHelp = new Menu("Help");
menuBar.getMenus().addAll(menuFile, menuEdit, menuView, menuHelp);
borderPane.setTop(menuBar);

TextArea textArea = new TextArea();
textArea.setPrefColumnCount(80);
borderPane.setCenter(textArea);

root.getChildren().add(borderPane);
primaryStage.setScene(scene);
primaryStage.show();

关于TextArea列数的说明

你提到没法调整列数,其实用textArea.setPrefColumnCount(int)就能设置初始列数,这个数值是基于默认字体的字符宽度来计算的。不过当TextArea放在BorderPane的中央区域时,它的宽度会自动随窗口大小调整;如果想固定宽度,可以额外设置textArea.setMaxWidth(Region.USE_PREF_SIZE)。

效果参考

你之前的运行效果是这样的:
之前的输出效果

修改后,TextArea会填满菜单栏下方的整个中央区域,还能正常响应窗口大小的调整。

内容的提问来源于stack exchange,提问作者Matthew Riley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:19:32