如何让JavaFX中两个可拉伸的ComboBox宽度一致?
解决方案
你的需求核心是让两个ComboBox始终保持相同宽度,且对应最宽按钮的ComboBox能最大化拉伸。问题根源在于两个按钮宽度不同,导致各自ComboBox的可用拉伸空间不一致,因此需要先统一两个按钮的宽度,再让ComboBox占据剩余空间。
实现步骤
- 计算两个按钮的宽度最大值,将两个按钮的首选宽度绑定到该最大值,确保两者宽度始终一致(取最宽按钮的宽度)。
- 保持原有的
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
相关产品推荐
相关产品推荐

