如何在JavaFX中使用SimpleLocalizedStringProperty(controlsfx-plugin)和ResourceBundle

时间:2016-07-05 21:29:28

标签: java javafx internationalization resourcebundle controlsfx

我正在使用 controlsfx 插件,我遇到了StringProperty的一个实现,其类型为:SimpleLocalizedStringProperty,并从以下位置导入:
import impl.org.controlsfx.i18n.SimpleLocalizedStringProperty;有没有人与这家酒店合作过;根据它的名称,我应该使用 ResourceBundle 来简化使用。但是没有关于如何将它与基于语言环境的ResourceBundles绑定的教程或详细信息。

如果有人能够与我们分享他/她对此酒店的体验,我们将不胜感激。

1 个答案:

答案 0 :(得分:1)

这个类应该从ResourceBundle加载具有特定模式的stings,并保持其他字符串不变。如果字符串以@@开头,则字符串的其余部分将用作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();
}

我的建议是:此时不要使用课程!!! (2016年7月)

它包含一些基本缺陷:

  • 覆盖getValue方法以返回本地化结果。然而,许多方法(包括getValue)使用get方法,这可能会导致意外行为。只需替换

    btn.textProperty().bind(prop);
    

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

    在上面的示例中,我们使用属性的键而不是本地化的值。

    get()getValue()应返回相同的值,此类不会执行该操作,因此会违反Liskov Substitution Principle

  • 如果没有触发更新,则值可能会发生变化。通过使用例如Locale进行更改impl.org.controlsfx.i18n.Localization.setLocale(Locale.FRANCE);(假设更改前的FRANCE以外的区域设置)将更改getValue()返回的值,而不通知听众。