有人可以给我看一个Bindings.bindBidirectional示例,其中textfield绑定到Double值,文本字段格式化为零小数位。我有这个约束力:
Bindings.bindBidirectional(xProperty, sp.layoutXProperty(), converter);
其中xProperty是StringProperty,sp.layoutXProperty是DoubleProperty。
我尝试了很多不同的转换器并最终决定:
NumberFormat nf = NumberFormat.getInstance();
StringConverter<Number> converter = new NumberStringConverter(nf);
然后我尝试了:
nf.setParseIntegerOnly(true);
但无济于事。这只是实现结果的众多尝试之一。它可能是直截了当的,但是关于使用格式绑定不同属性的信息似乎很少,或者我错过了显而易见的事情?
答案 0 :(得分:4)
查看此代码,看看它是否解决了您的问题:
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
答案 1 :(得分:3)
可能有不同的方法将double值转换为integer,在转换时使用不同的舍入。此答案与其他答案类似,附加过滤器仅允许文本字段中的整数值:
@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();
}