2015-08-24 25 views
3

有人可以给我看一个Bindings.bindBidirectional的示例,其中文本字段绑定到Double值并且文本字段被格式化为小数点后的零位。我有这个绑定:JavaFX 8数字格式的绑定

Bindings.bindBidirectional(xProperty, sp.layoutXProperty(), converter); 

其中xProperty是一个StringProperty和sp.layoutXProperty是一个DoubleProperty。

我已经尝试了许多不同的转换器,并最终选择:

NumberFormat nf = NumberFormat.getInstance();  
StringConverter<Number> converter = new NumberStringConverter(nf); 

然后我尝试:

nf.setParseIntegerOnly(true); 

,但无济于事。这只是实现结果的众多尝试之一。这可能是直截了当的,但关于使用格式绑定不同属性的信息似乎很少或很少,或者我错过了明显的?

回答

3

看看这段代码,看看它是否解决您的问题:

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 
3

可能有不同的方法转换双重价值为整数,使用不同的倒圆而转换。这个答案与其他类似,只有一个额外的过滤器允许在文本字段中使用整数值:

@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(); 
} 
+1

谢谢你的答案。我只能投一个,所以我会投第一个答复,但Uluk也给了我一些其他的想法以及这个例子。希望这些例子对其他人也有用。 – Frank