如何禁用JavaFX Spinner组件的单个箭头按钮?
解决JavaFX Spinner单个箭头按钮灰显问题
你之前的代码每次新建SpinnerValueFactory,会导致Spinner箭头按钮与工厂的绑定失效,所以功能正常但箭头不会自动灰显。下面是两种可行的解决方式:
方法一:复用现有ValueFactory(推荐)
初始化时为两个Spinner创建好对应的数值工厂,后续只修改工厂的min/max属性,这样箭头按钮的状态会自动绑定到工厂的可递增/递减状态:
初始化代码
// 初始化min spinner的数值工厂,范围[2,6],初始值设为2 SpinnerValueFactory.IntegerSpinnerValueFactory minValueFactory = new SpinnerValueFactory.IntegerSpinnerValueFactory(2, 6, 2); Spinner<Integer> spinnerMin = new Spinner<>(minValueFactory); // 初始化max spinner的数值工厂,范围[2,6],初始值设为6 SpinnerValueFactory.IntegerSpinnerValueFactory maxValueFactory = new SpinnerValueFactory.IntegerSpinnerValueFactory(2, 6, 6); Spinner<Integer> spinnerMax = new Spinner<>(maxValueFactory);
添加值变化监听器
// 监听min值变化,更新max的最小值范围 spinnerMin.valueProperty().addListener((observable, oldValue, newValue) -> { maxValueFactory.setMin(newValue); // 防止max当前值小于新的min值,自动调整max值 if (maxValueFactory.getValue() < newValue) { maxValueFactory.setValue(newValue); } }); // 监听max值变化,更新min的最大值范围 spinnerMax.valueProperty().addListener((observable, oldValue, newValue) -> { minValueFactory.setMax(newValue); // 防止min当前值大于新的max值,自动调整min值 if (minValueFactory.getValue() > newValue) { minValueFactory.setValue(newValue); } });
这样处理后:
- 当
spinnerMin和spinnerMax值相同时,spinnerMin的当前值等于其工厂的max,向上箭头会自动灰显; spinnerMax的当前值等于其工厂的min,向下箭头会自动灰显。
方法二:手动绑定箭头按钮的禁用状态
如果默认绑定不生效,可通过Spinner的Skin获取箭头按钮,手动绑定其disable属性:
// 处理spinnerMin的向上箭头 spinnerMin.skinProperty().addListener((obs, oldSkin, newSkin) -> { if (newSkin instanceof SpinnerSkin) { Button upArrow = (Button) newSkin.lookup(".increment-button"); if (upArrow != null) { // 当min值等于max值 或 min已达当前最大值时,禁用向上箭头 upArrow.disableProperty().bind( minValueFactory.valueProperty().isEqualTo(maxValueFactory.valueProperty()) .or(minValueFactory.valueProperty().isEqualTo(minValueFactory.maxProperty())) ); } } }); // 处理spinnerMax的向下箭头 spinnerMax.skinProperty().addListener((obs, oldSkin, newSkin) -> { if (newSkin instanceof SpinnerSkin) { Button downArrow = (Button) newSkin.lookup(".decrement-button"); if (downArrow != null) { // 当max值等于min值 或 max已达当前最小值时,禁用向下箭头 downArrow.disableProperty().bind( maxValueFactory.valueProperty().isEqualTo(minValueFactory.valueProperty()) .or(maxValueFactory.valueProperty().isEqualTo(maxValueFactory.minProperty())) ); } } });
内容的提问来源于stack exchange,提问作者mikyll98
相关产品推荐
相关产品推荐

