2016-04-12 44 views
0

Ben 40 4,0 saniye SimpleIntegerProperty çıkış

Ben Label ile kullanıcıya bu değeri görüntülemek istiyoruz

olduğu gibi 100 ms adımlarla zamanıdır bir sayı içeren bir SimpleIntegerProperty var mı nasıl biçimlendirilir hangi should ekran "4,0 s"

Ben basit ve yeniden kullanılabilir Conver oluşturabilirim

label.textProperty().bind(myobject.secondsProperty().asString());

ama nasıl gibi bağlamaları API ile değerini bağlamak istiyorum ter, sadece tek yönlü bağlama ihtiyacım var. , Sen

StringConverter<Integer> deciSecondsConverter = new StringConverter<Integer>() { 
    @Override 
    public String toString(Integer deciSeconds) { 
     return String.format("%.1f s", deciSeconds.doubleValue()/10); 
    } 

    @Override 
    public Integer fromString(String string) { 
     // not implemented 
     return null ; 
    } 
}; 

ve sonra

label.textProperty().bind(Bindings.createStringBinding(
    () -> deciSecondsConverter.toString(myobject.getSeconds()), 
    myobject.secondsProperty() 
)); 

SSCCE yapabilirsiniz Eğer gerçekten bir StringConverter gerekiyorsa

String secondsFormat = "%.1f s" ; 

label.textProperty().bind(myobject.secondsProperty().asString(secondsFormat)); 

:

cevap

1

Orada bir argüman olarak bir format string götüren bir overloaded form of the asString(...) method olduğunu :

import javafx.animation.AnimationTimer; 
import javafx.application.Application; 
import javafx.beans.binding.Bindings; 
import javafx.beans.property.IntegerProperty; 
import javafx.beans.property.SimpleIntegerProperty; 
import javafx.geometry.Insets; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.stage.Stage; 
import javafx.util.StringConverter; 

public class StopwatchTest extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     IntegerProperty tenthsOfSeconds = new SimpleIntegerProperty(); 
     Label label = new Label(); 
     StringConverter<Integer> deciSecondsConverter = new StringConverter<Integer>() { 
      @Override 
      public String toString(Integer deciSeconds) { 
       return String.format("%.1f s", deciSeconds.doubleValue()/10); 
      } 

      @Override 
      public Integer fromString(String string) { 
       // not implemented 
       return null ; 
      } 
     }; 

     label.textProperty().bind(Bindings.createStringBinding(() -> 
      deciSecondsConverter.toString(tenthsOfSeconds.get()), 
      tenthsOfSeconds)); 

     new AnimationTimer() { 

      @Override 
      public void handle(long now) { 
       tenthsOfSeconds.set((int)System.currentTimeMillis() % 60000/100); 
      } 

     }.start(); 

     label.setPadding(new Insets(5, 20, 5, 20)); 
     primaryStage.setScene(new Scene(label, 80, 30)); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+0

Bu beni doğru parçaya getirdi, ancak değer tamsayı olduğundan, dize ile biçimlendirme bu şekilde çalışmaz, çünkü '.1f işlevi int olarak uygulanamaz. This.label.textProperty() gibi bir şey yapmanız gerekir. Bind (Bindings.createFloatBinding (() -> (float) myObject.getSeconds()/10.0f, myObject.secondsProperty()). AsString (secondsFormat)) ; – pfried

+0

Dönüştürücü kendisini düzeltmek için muhtemelen daha iyi. Güncellemeye bakın. –