Добавить слушателя к свойству объекта 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()?


person Tobi    schedule 12.12.2018    source источник


Ответы (1)


Вам не хватает зависимости в вызове Bindings.createObjectBinding().

Вам нужно использовать

Bindings.createObjectBinding(() -> number.getValue().signum(), number)
person fabian    schedule 12.12.2018