Cette classe est supposée charger les piqûres avec un motif spécifique à partir d'un ResourceBundle
et conserver les autres chaînes telles qu'elles sont. Si une chaîne commence par @@
, le reste de la chaîne est utilisé comme clé pour controlsfx.properties
properties file.
Exemple:
@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();
}
Ma recommandation cependant: Ne pas utiliser la classe à ce moment !!! (Juillet 2016)
Il contient quelques défauts fondamentaux:
La méthode getValue
est écrasée pour renvoyer le résultat localisé. De nombreuses méthodes, notamment getValue
, utilisent cependant la méthode get
, ce qui peut entraîner un comportement inattendu. Il suffit de remplacer
btn.textProperty().bind(prop);
avec
btn.textProperty().bind(Bindings.when(new SimpleBooleanProperty(true)).then(prop).otherwise((String) null))
dans l'exemple ci-dessus et la clé de la propriété nous utilisé au lieu de la valeur localisée.
get()
et getValue()
sont censés retourner la même valeur, ce que cette classe ne fait pas et viole donc le Liskov Substitution Principle.
La valeur peut changer sans qu'une mise à jour ne soit déclenchée. En changeant le Locale
en utilisant par ex. impl.org.controlsfx.i18n.Localization.setLocale(Locale.FRANCE);
(en supposant que les paramètres régionaux autres que FRANCE
avant la modification) modifient la valeur renvoyée par getValue()
sans notifier les écouteurs.
Salut Fabian, j'apprécie vraiment que vous ayez fait beaucoup d'efforts et beaucoup de votre temps pour écrire cette explication très complète et détaillée. Malheureusement 'SimpleLocalizedStringProperty' n'a pas encore mûri, je vous demande si vous pouvez recommander des frameworks i18n ou des approches de codage pour que StringProperty charge son contenu depuis ResourceBundle qui a été précédemment injecté via' FXMLLoader loader = new FXMLLoader (URL, ResourceBundle) '? Avec SceneBuilder on peut charger n'importe quel textnode à partir de ResourceBundle avec 'text ="% keyValue "', y a-t-il quelque chose de similaire à ceci pour StringProperties? – Chiggiddi