谁能告诉我一个绑定的例子。bindBidirectional,将文本字段绑定到Double值,并且将文本字段格式化为小数点后零位。我有这样的绑定:
Bindings.bindBidirectional(xProperty, sp.layoutXProperty(), converter);
其中xProperty为StringProperty, sp.layoutXProperty为DoubleProperty。
我尝试了许多不同的转换器,最后决定:
NumberFormat nf = NumberFormat.getInstance();
StringConverter<Number> converter = new NumberStringConverter(nf);
Then I try:
nf.setParseIntegerOnly(true);
但无济于事。这只是为达到这个结果而进行的众多尝试中的一次。这可能很直接,但是关于将不同属性与格式绑定的信息似乎很少,或者我错过了明显的信息吗?
看一下这段代码,看看它是否解决了你的问题:
public class BindingTest {
static Property<String> sp;
static Property<Double> dp;
public static void main(String[] args) {
sp = new SimpleStringProperty();
dp = new SimpleObjectProperty<>();
StringConverter<Double> sc = new StringConverter<Double>() {
@Override
public String toString(Double object) {
if (object != null)
return Integer.toString((int) Math.round(object.doubleValue()));
else
return null;
}
@Override
public Double fromString(String string) {
Double d = Double.parseDouble(string);
sp.setValue(Integer.toString((int) Math.round(d)));
return d;
}
};
Bindings.bindBidirectional(sp, dp, sc);
print();
sp.setValue("3.14");
print();
dp.setValue(6.18);
print();
}
public static void print() {
System.out.println("String: " + sp.getValue() + "t" + "Double: " + dp.getValue());
}
}
输出:String: null Double: null
String: 3 Double: 3.14
String: 6 Double: 6.18
可能有不同的方法将双精度值转换为整数,在转换时使用不同的四舍五入。这个答案与其他答案类似,它有一个额外的过滤器,只允许文本字段中的整数值:
@Override
public void start( Stage stage )
{
TextField field = new TextField();
DoubleProperty doubleProperty = new SimpleDoubleProperty();
Label label = new Label();
label.textProperty().bind( doubleProperty.asString() );
DecimalFormat format = new DecimalFormat();
format.setParseIntegerOnly( true ); // used while parsing the input text of textfield
format.setMaximumFractionDigits( 0 ); // used while formatting the doubleProperty's bound value as output text of textfield
format.setGroupingUsed( false ); // disable thousand grouping
format.setRoundingMode( RoundingMode.UP ); // set rounding mode
Bindings.bindBidirectional( field.textProperty(), doubleProperty, new StringConverter<Number>()
{
@Override
public String toString( Number object )
{
return object == null ? "" : format.format( object );
}
@Override
public Number fromString( String string )
{
return (string != null && !string.isEmpty()) ? Double.valueOf( string ) : null;
}
} );
// apply filter to allow only integer values
field.setTextFormatter( new TextFormatter<>( c ->
{
if ( c.getControlNewText().isEmpty() )
{
return c;
}
ParsePosition parsePosition = new ParsePosition( 0 );
Object object = format.parse( c.getControlNewText(), parsePosition );
if ( object == null || parsePosition.getIndex() < c.getControlNewText().length() )
{
return null;
}
else
{
return c;
}
} ) );
Button b = new Button( "+1.6" );
b.setOnAction( ( e ) ->
{
doubleProperty.set( doubleProperty.get() + 1.6 );
} );
Scene scene = new Scene( new VBox( 5 ) );
stage.setWidth( 450 );
stage.setHeight( 250 );
(( VBox ) scene.getRoot()).getChildren().addAll( field, label, b );
stage.setScene( scene );
stage.show();
}