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.
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