Добавьте слушателя к свойству объекта javafx - PullRequest
0 голосов
/ 12 декабря 2018

В моей программе 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 ()?

1 Ответ

0 голосов
/ 12 декабря 2018

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

Вам необходимо использовать

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