簡體   English   中英

JavaFX:有沒有辦法只禁用微調器的一個按鈕?

[英]JavaFX: Is there a way to disable only one button of the Spinner?

我只想禁用JavaFX Spinner 組件一個箭頭按鈕,這樣它們就不能假定非法值:我有 2 個 Spinner 組件“Min 和“Max”,其值范圍為 [2-6],如圖所示;我想要的行為是,當它們達到相同的值(例如 Min:3,Max:3)時,Min 的向上箭頭以及 Max 的向下箭頭被禁用。

通緝行為

任何人都知道這是否可能,或者我怎樣才能以最順利的方式實現這一目標?

編輯:感謝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()));
});

絕對可以根據微調器中的值設置按鈕樣式。

以下是您可以完成所需行為的一種方法。

一般的想法是在達到最小/最大值時為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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM