向对象 属性 javafx 添加侦听器

Add a listener to object property javafx

在我的 javafx 程序中,我有一个 ObjectProperty 来侦听 BigDecimal 值(如果它发生变化)。

final ObjectProperty<BigDecimal> number = new SimpleObjectProperty<>();
number.addListener((observableValue, oldValue, newValue) -> System.out.println("Do something!"));

现在我还想监听 BigDecimal.signum() 方法值,因为如果仅更改符号,上面的监听器将无法工作。 我试图创建一个新的 ObjectBinding 并向其添加一个侦听器,但没有成功。

final ObjectBinding<Integer> signumBinding = Bindings.createObjectBinding(() -> number.getValue().signum());
signumBinding.addListener((observableValue, oldValue, newValue) -> System.out.println("Do anything else!"));

这里是完整代码:

import java.math.BigDecimal;
import java.text.NumberFormat;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;

public class NumericTextField extends TextField {

    private final NumberFormat nf;
    private final ObjectProperty<BigDecimal> number = new SimpleObjectProperty<>();
    private final boolean negativAllowed;

    public final BigDecimal getNumber()
    {
        return number.get();
    }

    public final void setNumber(final BigDecimal value)
    {
        number.set(value);
    }

    public ObjectProperty<BigDecimal> numberProperty()
    {
        return number;
    }

    public NumericTextField()
    {
        this(BigDecimal.ZERO);
    }

    public NumericTextField(final BigDecimal value)
    {
        this(value, NumberFormat.getInstance(), true);
        initHandlers();
    }

    public NumericTextField(final BigDecimal value,
            final NumberFormat nf,
            final boolean negativAllowed)
    {
        super();
        this.negativAllowed = negativAllowed;
        this.nf = nf;
        initHandlers();
        setNumber(value);
    }

    private void initHandlers()
    {
        focusedProperty().addListener((observableValue, oldValue, newValue) -> {
            if (!newValue)
            {
                parseAndFormatInput();
            }
        });
        this.numberProperty().addListener((observableValue, oldValue, newValue) -> setText(nf.format(newValue)));
    }

    private void parseAndFormatInput()
    {
        try
        {
            final String input = getText();
            BigDecimal newValue;

            if (input == null || input.length() == 0) {
                newValue = BigDecimal.ZERO;
            } else
            {
                final Number parsedNumber = nf.parse(input);
                newValue = new BigDecimal(parsedNumber.toString());
                if (!negativAllowed) {
                    newValue = newValue.abs();
                }
            }

            setNumber(newValue);
            selectAll();
        }
        catch (final ParseException ex)
        {
            setText(nf.format(number.get()));
        }
    }
}

谁能告诉我如何监听 BigDecimal.signum() 方法值?

您在 Bindings.createObjectBinding() 调用中缺少依赖项。

您需要使用

Bindings.createObjectBinding(() -> number.getValue().signum(), number)