根据微调按钮中的值来设置按钮的样式是完全可能的.
以下是实现所需行为的一种方法.
一般的 idea 是,当达到最小/最大值时,将一些伪状态设置为Spinner
.并基于伪状态设置箭头按钮的样式.
下面是上述方法的样例演示.
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;
}
也可能有其他方式.但我认为使用这种方法,您可以更好地控制造型.