gpt4 book ai didi

java - 向对象属性 javafx 添加监听器

转载 作者:太空宇宙 更新时间:2023-11-04 09:58:58 27 4
gpt4 key购买 nike

在我的 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)

关于java - 向对象属性 javafx 添加监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53745004/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com