我想要JavaFX Spinner component个中的disable just one arrow-button个,这样他们就不会采用非法的值: 我有两个微调组件"Min"和"Max",取值范围为[2-6],就像在this picture中一样;我想要的行为是,当它们达到相同的值时(例如,Min:3,Max:3),Min的向上箭头和Max的向下箭头被禁用.

Wanted behaviour

谁知道这是否可能,或者我如何以最顺利的方式实现这一点?

编辑: 谢谢你的建议.我已经有了added a listener to the valueProperty and set the valueFactory to change the range,而且它工作正常,尽管它仍然不能禁用和"灰显"箭头,这是我想要实现的行为(但在这一点上,我想知道这是否可能).

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()));
});

推荐答案

根据微调按钮中的值来设置按钮的样式是完全可能的.

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

一般的 idea 是,当达到最小/最大值时,将一些伪状态设置为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;
}

也可能有其他方式.但我认为使用这种方法,您可以更好地控制造型.

Java相关问答推荐

我们如何直接使用kerminldap服务票证来通过ldap进行身份验证并形成LDAP上下文

RDX触发ChoiceBox转换器(并按字符串值排序)

我可以从Java模块中排除maven资源文件夹吗?

Oracle DUAL表上使用DDL时jOOQ问题的解析'

屏蔽字母数字代码的Java正则表达式

滚动视图&不能在alert 对话框中工作(&Q;&Q;)

通过合并Akka Streams中的多个慢源保持订购

将不受支持的时区UT重写为UTC是否节省?

Bean定义不是从Spring ApplationConext.xml文件加载的

与Spring Boot相关的实体未正确保存

SonarLint:只能有条件地调用方法(S)

我的Spring Boot测试显示&IlLegalStateException:无法加载某事的ApplicationContext.

如何仅使用键/ID的一部分(组合)高效地返回映射值?

SpringBoot:在条件{Variable}.isBlank/{Variable}.isEmpty不起作用的情况下进行路径变量验证

为什么StandardOpenOption.CREATE不能通过Ubuntu在中小企业上运行?

如何根据配置动态创建N个bean

如何在Selenium上继续使用最新的WebDriver版本

简化每个元素本身都是 map 列表的列表

Java方法参数:括号中的类型声明?

窗口启动后不久,从java.awt.Graphics disapear创建的矩形