向对象 属性 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)
在我的 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)