JavaFX:是否有一种方法可以禁用 Spinner 中的一个按钮?

3
我希望您能翻译以下内容:

我想禁用JavaFX Spinner组件中的一个箭头按钮,以便它们不能采用非法值:我有两个组件spinnerMinspinnerMax,其取值范围为[2-6],如this picture所示;我想要的行为是当它们达到相同的值(例如最小值:3,最大值:3)时,最小值的上箭头和最大值的下箭头都变为禁用状态。

Wanted behaviour

请问是否有可能实现这个功能,或者如何以最顺畅的方式实现?

编辑: 感谢jewelsea的建议。我已经添加了一个监听器到valueProperty,并设置了valueFactory来改变范围,它按预期工作,尽管它仍然没有禁用和“灰化”箭头,这是我想要实现的行为(但此时我在想它是否可能)。

spinnerMin.valueProperty().addListener((changed, oldval, newval) -> {
    spinnerMax.setValueFactory(new SpinnerValueFactory.IntegerSpinnerValueFactory(newval, 6, spinnerMax.getValue()));
});

spinnerMax.valueProperty().addListener((changed, oldval, newval) -> {
    spinnerMin.setValueFactory(new SpinnerValueFactory.IntegerSpinnerValueFactory(2, newval, spinnerMin.getValue()));
});

4
当所需的范围更改时,请尝试更改微调器value factory的最大/最小值,以匹配新范围 - jewelsea
1个回答

8

可以根据微调器中的值来设置按钮的样式。

以下是一种实现所需行为的方法。

总体思路是在达到最小/最大值时为Spinner设置一些伪状态,并根据伪状态来设置箭头按钮的样式。

以下是上述方法的示例演示。

enter image description here

import javafx.application.Application;
import javafx.css.PseudoClass;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Spinner;
import javafx.scene.control.SpinnerValueFactory;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class SpinnerDemo extends Application {
    @Override
    public void start(Stage stage) throws Exception {
        PseudoClass minPseudo = PseudoClass.getPseudoClass("minvalue");
        PseudoClass maxPseudo = PseudoClass.getPseudoClass("maxvalue");

        Spinner<Integer> spinner = new Spinner<>();
        spinner.getStyleClass().add(Spinner.STYLE_CLASS_SPLIT_ARROWS_VERTICAL);
        SpinnerValueFactory.IntegerSpinnerValueFactory valueFactory = new SpinnerValueFactory.IntegerSpinnerValueFactory(2, 5);
        spinner.valueProperty().addListener((obs, old, val) -> {
            spinner.pseudoClassStateChanged(minPseudo, val == valueFactory.getMin());
            spinner.pseudoClassStateChanged(maxPseudo, val == valueFactory.getMax());
        });
        spinner.setValueFactory(valueFactory);

        StackPane root = new StackPane(spinner);
        root.setPadding(new Insets(15));
        Scene sc = new Scene(root, 250, 200);
        sc.getStylesheets().add(getClass().getResource("spinner.css").toString());
        stage.setScene(sc);
        stage.setTitle("Spinner");
        stage.show();
    }
}

CSS 代码:

.spinner:maxvalue .increment-arrow-button {
    -fx-background-color: -fx-outer-border, #999999;
}
.spinner:minvalue .decrement-arrow-button {
     -fx-background-color: -fx-outer-border, #999999;
}

可能还有其他方法,但我认为使用这种方法可以更好地控制样式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接