如何在 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,而不通知听众。