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

如何让JavaFX中两个可拉伸的ComboBox宽度一致?

解决方案

你的需求核心是让两个ComboBox始终保持相同宽度,且对应最宽按钮的ComboBox能最大化拉伸。问题根源在于两个按钮宽度不同,导致各自ComboBox的可用拉伸空间不一致,因此需要先统一两个按钮的宽度,再让ComboBox占据剩余空间。

实现步骤

  1. 计算两个按钮的宽度最大值,将两个按钮的首选宽度绑定到该最大值,确保两者宽度始终一致(取最宽按钮的宽度)。
  2. 保持原有的HBox.setHgrow(comboBox, Priority.ALWAYS)配置,让ComboBox占据ToolBar中除按钮外的所有剩余空间,此时两个ComboBox的可用空间相同,自然宽度一致。

修改后的代码

public class JavaFxTest7 extends Application {

    @Override
    public void start(Stage stage) {
        var button1 = new Button("Text with unknown length");
        var comboBox1 = new ComboBox<String>();
        comboBox1.setEditable(true);
        comboBox1.setMaxWidth(Double.MAX_VALUE);
        var toolBar1 = new ToolBar(comboBox1, button1);
        HBox.setHgrow(comboBox1, Priority.ALWAYS);

        var button2 = new Button("Another text with unknown length");
        var comboBox2 = new ComboBox<String>();
        comboBox2.setEditable(true);
        comboBox2.setMaxWidth(Double.MAX_VALUE);
        HBox.setHgrow(comboBox2, Priority.ALWAYS);
        var toolBar2 = new ToolBar(comboBox2, button2);

        // 绑定两个按钮的宽度为两者的最大值,确保宽度一致
        DoubleBinding maxButtonWidth = Bindings.max(button1.widthProperty(), button2.widthProperty());
        button1.prefWidthProperty().bind(maxButtonWidth);
        button2.prefWidthProperty().bind(maxButtonWidth);

        Scene scene = new Scene(new VBox(toolBar1, toolBar2), 800, 200);
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch();
    }
}

原理说明

  • Bindings.max(button1.widthProperty(), button2.widthProperty())会实时计算两个按钮的宽度最大值,当按钮文本因语言切换或窗口缩放导致宽度变化时,这个值会自动更新。
  • 将按钮的prefWidthProperty()绑定到该最大值后,两个按钮会始终保持相同的宽度(即最宽按钮的宽度)。
  • 由于两个ToolBar的总宽度一致,ComboBox又被设置为占据剩余所有空间,因此两个ComboBox的宽度会自动同步,且随窗口大小变化时保持一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 17:16:17