如何让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

