如何在 JavaFX 中将 SimpleLocalizedStringProperty(controlsfx-plugin)与 ResourceBundle 一起使用
Howto use SimpleLocalizedStringProperty (controlsfx-plugin) with ResourceBundle in JavaFX
我正在使用 controlsfx 插件,我遇到了 StringProperty 的一个实现,它的类型为:SimpleLocalizedStringProperty
并从以下位置导入:
import impl.org.controlsfx.i18n.SimpleLocalizedStringProperty;
有没有人用过这个属性;根据它的名字,我假设它应该使用 ResourceBundle 来简化使用。但是没有关于如何将其与基于语言环境的 ResourceBundle 绑定的教程或详细信息。
如果这里有人能够与我们分享 his/her 对此 属性 的经验,我们将不胜感激。
这个 class 应该从 ResourceBundle
中加载具有特定模式的字符串,并保持其他字符串不变。如果字符串以 @@
开头,则字符串的其余部分用作 controlsfx.properties
properties file.
的键
示例:
@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();
}
不过我的建议是:此时不要使用 class!!!(2016 年 7 月)
它包含一些基本缺陷:
getValue
方法被覆盖为return本地化结果。但是,包括 getValue
在内的许多方法都使用 get
方法,这可能会导致意外行为。只需更换
btn.textProperty().bind(prop);
和
btn.textProperty().bind(Bindings.when(new SimpleBooleanProperty(true)).then(prop).otherwise((String) null))
在上面的示例中,我们使用 属性 的键来代替本地化的值。
get()
和 getValue()
应该 return 相同的值,而这个 class 不这样做,因此违反了 Liskov Substitution Principle.
该值可以在不触发更新的情况下更改。通过使用例如更改 Locale
impl.org.controlsfx.i18n.Localization.setLocale(Locale.FRANCE);
(假设更改前的区域设置不是 FRANCE
)将更改由 getValue()
编辑的值 return,而不通知听众。
我正在使用 controlsfx 插件,我遇到了 StringProperty 的一个实现,它的类型为:SimpleLocalizedStringProperty
并从以下位置导入:import impl.org.controlsfx.i18n.SimpleLocalizedStringProperty;
有没有人用过这个属性;根据它的名字,我假设它应该使用 ResourceBundle 来简化使用。但是没有关于如何将其与基于语言环境的 ResourceBundle 绑定的教程或详细信息。
如果这里有人能够与我们分享 his/her 对此 属性 的经验,我们将不胜感激。
这个 class 应该从 ResourceBundle
中加载具有特定模式的字符串,并保持其他字符串不变。如果字符串以 @@
开头,则字符串的其余部分用作 controlsfx.properties
properties file.
示例:
@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();
}
不过我的建议是:此时不要使用 class!!!(2016 年 7 月)
它包含一些基本缺陷:
getValue
方法被覆盖为return本地化结果。但是,包括getValue
在内的许多方法都使用get
方法,这可能会导致意外行为。只需更换btn.textProperty().bind(prop);
和
btn.textProperty().bind(Bindings.when(new SimpleBooleanProperty(true)).then(prop).otherwise((String) null))
在上面的示例中,我们使用 属性 的键来代替本地化的值。
get()
和getValue()
应该 return 相同的值,而这个 class 不这样做,因此违反了 Liskov Substitution Principle.该值可以在不触发更新的情况下更改。通过使用例如更改
Locale
impl.org.controlsfx.i18n.Localization.setLocale(Locale.FRANCE);
(假设更改前的区域设置不是FRANCE
)将更改由getValue()
编辑的值 return,而不通知听众。