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

如何让FlowPane内VBox的ListView随窗口最大化按比例自适应增长

嘿,我懂你要实现的效果——窗口从默认尺寸切换到最大化时,VBox里的ListView能按比例自适应放大,对吧?结合你给出的代码片段,我来给你梳理下问题和解决方案:

问题根源

默认情况下,JavaFX控件的prefHeight/prefWidth是固定值,而且如果不给VBox里的控件设置空间增长优先级,窗口最大化时它们只会保持原有尺寸,不会自动填充可用空间。另外,要保持比例的话,还得给ListView设置比例约束。

解决方案步骤

1. 确保VBox占据BorderPane的中心区域

BorderPane的Center区域会自动填充窗口的剩余空间,所以把包含ListView的VBox放在这里是基础:

this.setCenter(yourVBox);

2. 给ListView设置垂直增长优先级

用VBox.setVgrow()方法,把需要自适应的ListView的增长优先级设为Priority.ALWAYS,这样它们会抢占VBox里的可用空间:

import javafx.scene.layout.Priority;

// 初始化你的ListView后
VBox.setVgrow(Term1UnSelect, Priority.ALWAYS);
VBox.setVgrow(Term2UnSelect, Priority.ALWAYS);
VBox.setVgrow(Term1Select, Priority.ALWAYS);
// 其他需要自适应的ListView同理

3. 保持ListView的尺寸比例

如果希望多个ListView保持固定比例(比如1:1,或者2:1),只需要给它们设置对应的prefHeight值就行——VBox会根据这个值的比例来分配空间:

// 比如让Term1UnSelect和Term2UnSelect保持1:1的高度比例
Term1UnSelect.setPrefHeight(1);
Term2UnSelect.setPrefHeight(1);

// 如果要2:1的比例,就改成
// Term1UnSelect.setPrefHeight(2);
// Term2UnSelect.setPrefHeight(1);

4. 处理VBox里的其他控件

如果VBox里还有按钮、文本框这类不需要缩放的控件,给它们设置Priority.NEVER,让它们保持原有尺寸:

VBox.setVgrow(Term1AddBtn, Priority.NEVER);
VBox.setVgrow(txtTerm1Cred, Priority.NEVER);

完整代码示例片段

把这些整合到你的构造函数里大概是这样:

public class Modules extends BorderPane {
    private Button Term1AddBtn, Term2AddBtn, Term2RemoveBtn, ResetBtn, SubmitBtn;
    private ListView<?> Term1UnSelect, Term2UnSelect, Term1Select, Term2Select, YearSelect;
    private TextField txtTerm1Cred, txtTerm2Cred; // 修正了你重复的变量名

    public Modules() {
        // 初始化所有控件
        Term1UnSelect = new ListView<>();
        Term2UnSelect = new ListView<>();
        Term1AddBtn = new Button("Add Term1");
        txtTerm1Cred = new TextField();
        // ...其他控件初始化

        // 创建VBox并添加控件
        VBox vbox = new VBox(Term1AddBtn, txtTerm1Cred, Term1UnSelect, Term2UnSelect);
        vbox.setSpacing(8); // 设置控件间的间距

        // 设置空间增长规则
        VBox.setVgrow(Term1AddBtn, Priority.NEVER);
        VBox.setVgrow(txtTerm1Cred, Priority.NEVER);
        VBox.setVgrow(Term1UnSelect, Priority.ALWAYS);
        VBox.setVgrow(Term2UnSelect, Priority.ALWAYS);

        // 设置ListView的比例(这里是1:1)
        Term1UnSelect.setPrefHeight(1);
        Term2UnSelect.setPrefHeight(1);

        // 把VBox放到BorderPane的中心
        this.setCenter(vbox);

        // ...其他布局逻辑
    }
}

额外注意事项

  • 不要给ListView设置固定的maxHeight,否则会限制它们的最大缩放尺寸;如果需要最小高度,可以设置minHeight为合理值,但别设成固定值。
  • 如果BorderPane的其他区域(Top/Bottom/Left/Right)有控件,确保它们的尺寸是固定的(比如设置prefHeight),避免抢占Center区域的空间。

这样调整后,当窗口最大化时,你的ListView就会按设定的比例自适应增长啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:28:50