0

ich mit dem controlsfx Plugin arbeite und ich kam in einer Implementierung für den String der vom Typ ist: SimpleLocalizedStringProperty und importiert aus:
import impl.org.controlsfx.i18n.SimpleLocalizedStringProperty; Hat jemand arbeitete mit diese Liegenschaft; nach seinem Namen sollte es die Verwendung mit einem ResourceBundle Ich nehme an. Aber es gibt keine Tutorials oder detaillierte Informationen darüber, wie man es mit locale-basierten ResourceBundles bindet.Howto verwenden SimpleLocalizedStringProperty (controlsfx-Plugin) mit Resource in JavaFX

Es würde sehr geschätzt werden, wenn jemand hier in der Lage wäre, mit uns seine Erfahrungen mit dieser Eigenschaft zu teilen.

Antwort

1

Diese Klasse soll Stiche mit einem bestimmten Muster aus einer ResourceBundle laden und andere Strings behalten wie sie sind. Wenn eine Zeichenfolge mit @@ beginnt, wird der Rest der Zeichenfolge als Schlüssel für die controlsfx.properties properties file verwendet.

Beispiel:

@Override 
public void start(Stage primaryStage) { 
    SimpleLocalizedStringProperty prop = new SimpleLocalizedStringProperty("Hello World"); 
    Button btn = new Button(); 
    btn.textProperty().bind(prop); 
    btn.setOnAction((ActionEvent event) -> { 
     prop.set("@@font.dlg.title"); 
    }); 

    StackPane root = new StackPane(); 
    root.getChildren().add(btn); 

    Scene scene = new Scene(root, 500, 300); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 

Meine Empfehlung jedoch: nicht die Klasse zu diesem Zeitpunkt Verwenden Sie !!! (Juli 2016)

es einige grundlegende Mängel enthält:

  • Die getValue Methode überschrieben die lokalisierte Ergebnis zurückzukehren. Viele Methoden, einschließlich getValue, verwenden jedoch die Methode get, die zu unerwartetem Verhalten führen kann. Ersetzen Sie einfach

    btn.textProperty().bind(prop); 
    

    mit

    btn.textProperty().bind(Bindings.when(new SimpleBooleanProperty(true)).then(prop).otherwise((String) null)) 
    

    im obigen Beispiel und dem Schlüssel der Eigenschaft uns anstelle des lokalisierten Wert verwendet.

    get() und getValue() sollen den gleichen Wert zurückgeben, was diese Klasse nicht tut und daher die Liskov Substitution Principle verletzt.

  • Der Wert kann sich ändern, ohne dass ein Update ausgelöst wird. Durch Ändern der Locale unter Verwendung von z.B. impl.org.controlsfx.i18n.Localization.setLocale(Locale.FRANCE); (unter der Annahme einer anderen Ländereinstellung als FRANCE vor der Änderung) wird der von getValue() zurückgegebene Wert geändert, ohne die Listener zu benachrichtigen.

+0

Hallo Fabian, ich weiß es wirklich zu schätzen, dass du große Mühe und viel Zeit investiert hast, um diese sehr umfassende und detaillierte Erklärung zu schreiben. Leider ist 'SimpleLocalizedStringProperty' noch nicht ausgereift, ich frage Sie, ob Sie irgendwelche i18n Frameworks oder Codierungsansätze empfehlen können, damit StringProperty seinen Inhalt von ResourceBundle lädt, die zuvor über' FXMLLoader loader = new FXMLLoader (URL, ResourceBundle) injiziert wurden '? Mit SceneBuilder kann man jeden Textknoten aus ResourceBundle laden mit 'text ="% keyValue "', gibt es etwas Ähnliches für StringProperties? – Chiggiddi