0

に私はcontrolsfxプラグインで働いていると私は型であるStringPropertyの実装に出くわしたResourceBundleでSimpleLocalizedStringProperty(controlsfx-プラグイン)を使用
import impl.org.controlsfx.i18n.SimpleLocalizedStringProperty;誰と協力してきましたこのプロパティ。その名前によると、それを使用して簡単にする必要がありますResourceBundle私は仮定します。しかし、チュートリアルやロケールベースのResourceBundlesとのバインド方法に関する詳細はありません。HOWTOはJavaFXの

ここに誰かがこのプロパティで私たちと経験を分かち合うことができれば幸いです。

答えて

1

このクラスは、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(); 
} 

私の推薦しかし:は、この時点ではクラスを使用しないでください!(2016年7月)それはいくつかの基本的な欠陥が含まれてい

  • getValue方法は、ローカライズされた結果を返すために上書きされます。ただし、getValueを含む多くの方法ではgetメソッドが使用され、予期しない動作が発生する可能性があります。ただ、

    btn.textProperty().bind(Bindings.when(new SimpleBooleanProperty(true)).then(prop).otherwise((String) null)) 
    
    上記の例では

    と私たちが代わりにローカライズされた値を使用するプロパティのキーと

    btn.textProperty().bind(prop); 
    

    を交換してください。

    get()getValue()は同じ値を返すと想定されています。これはこのクラスでは行われないため、Liskov Substitution Principleに違反しています。

  • 更新が実行されずに値が変更されることがあります。たとえば、Localeを変更するとimpl.org.controlsfx.i18n.Localization.setLocale(Locale.FRANCE);(変更前にFRANCE以外のロケールがあると仮定した場合)は、リスナーに通知することなくgetValue()によって返される値を変更します。

+0

こんにちはファビアン、私は本当にあなたがこの非常に包括的で詳細な説明を書くために多くの時間と労力を費やしたことに感謝します。残念ながら 'SimpleLocalizedStringProperty'はまだ成熟していません。あなたは、以前に' FXMLLoader loader = new FXMLLoader(URL、ResourceBundle) 'を介して注入されたResourceBundleからそのコンテンツをロードするためにStringPropertyを作るためのi18nフレームワークやコーディング手法をお勧めしますか? SceneBuilderでは、 'text ="%keyValue "'でResourceBundleからテキストノードをロードできますが、StringPropertiesにはこれに類似したものがありますか? – Chiggiddi