根据JavaFX8中的Predicate禁用按钮

时间:2016-01-20 15:16:29

标签: javafx-8

我正在使用JavaFX8处理PDF查看器并具有“向上翻页”和“向下翻页”按钮。如果当前显示的页面是第一页,我希望禁用“向上翻页”按钮。

首先,我已经向我的控制器添加了一个isFirstPage BooleanProperty实例变量(我根据当前页码设置为true或false),这样可以正常工作,但添加实例变量似乎有点过头了。应用程序的每个状态(isFirstPage,isLastPage,isDocumentLoaded等)。

我想要实现的是将disableProperty绑定到Predicate(每次selectedPageNo更改时都会对其进行评估),但显然我做错了,因为代码不起作用(按钮永远不会被禁用):< / p>

nextPageButton.disableProperty().bind(Bindings.createBooleanBinding(() ->
                 selectedPageNo.intValue() >= currentDocument.getNumberOfPages()));

此处selectedPageNoIntegerPropertycurrentDocumentorg.apache.pdfbox.pdmodel.PDDocument

1 个答案:

答案 0 :(得分:1)

三种不同的方式:

IntegerProperty API

你可以做到

nextPageButton.disableProperty().bind(
    selectedPageNo.greaterThanOrEqualTo(currentDocument.getNumberOfPages()));

如果页数可能会更改并且也由IntegerProperty表示,则

nextPageButton.disableProperty().bind(
    selectedPageNo.greaterThanOrEqualTo(currentDocument.numberOfPagesProperty()));

将观察这两个属性并根据需要进行更新。

Bindings API

对于IntegerProperty继承自NumberExpressionBase的方法不支持的更一般的计算,您几乎可以像使用它一样使用Bindings API。你省略的是提供绑定需要观察的属性:

nextPageButton.disableProperty().bind(Bindings.createBooleanBinding(() -> 
    selectedPageNo.intValue() >= currentDocument.getNumberOfPages(),
    selectedPageNo));

子类BooleanBinding

另一种方法是直接子类BooleanBinding

nextPageButton.disableProperty().bind(new BooleanBinding() {
    {
        bind(selectedPageNo);
    }

    @Override
    protected boolean computeValue() {
        return selectedPageNo.intValue() >= currentDocument.getNumberOfPages();
    }
});