0

I try to bind my Labels text property to a String which comes from my LanguageModel. I want the property to update as soon as I the language of the LanguageModel is set (again).

In my Controller class I have this:

@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
    this.patientLabel.textProperty().bind(LanguageModel.getObservableText("patientLabel"));
}

The real problem is in the LanguageModel class itself:

public class LanguageModel extends Model {
    private static final String GET_ALL_LANGUAGE_ENTRIES_QUERY = "SELECT * FROM Language";

    private static LanguageModel instance;
    private static String language;

    private List<Pair<String, String>> languageEntries;
    //private static List<ObservableStringValue> observableStringValueList;

    private static LanguageModel getInstance() {
        if(LanguageModel.instance == null) {
            LanguageModel.instance = (LanguageModel) MainApplication.context.getBean("languageModel");
        }

        return LanguageModel.instance;
    }

    public static void setLanguage(String language) {
        LanguageModel.language = language;

        LanguageModel.getInstance().getLanguageEntries();
    }

    public static String getText(String key) {
        LanguageModel model = LanguageModel.getInstance();

        for(Pair<String, String> pair : model.languageEntries) {
            if(pair.getKey().equals(key)) return pair.getValue();
        }

        return null;
    }

    public static ObservableStringValue getObservableText(final String key) {
        ObservableStringValue observableStringValue = new ObservableStringValue() {
            @Override
            public String get() {
                return LanguageModel.getText(key);
            }

            @Override
            public void addListener(ChangeListener<? super String> listener) {

            }

            @Override
            public void removeListener(ChangeListener<? super String> listener) {

            }

            @Override
            public String getValue() {
                return LanguageModel.getText(key);
            }

            @Override
            public void addListener(InvalidationListener listener) {

            }

            @Override
            public void removeListener(InvalidationListener listener) {

            }
        };

        //LanguageModel.observableStringValueList.add(observableStringValue);

        return observableStringValue;
    }

    private void getLanguageEntries() {
        this.languageEntries = this.template.query(GET_ALL_LANGUAGE_ENTRIES_QUERY, new Object[]{}, new LanguageMapper(LanguageModel.language));
    }
}

I don't know how to say the ObservableStringValues to update after the LanguageModel.setLanguage()-method is called. Maybe a ObservableStringValue is not even necessary.

I just want that the text-property of every GUI-element updated if the language is changed.

EDIT: maybe it's not the job of the LanguageModel to make the String "observable"; I think I should implement this in the Controller class. But again, I don't know how to say "OK, update now", and if I think closer, I conclude that the Observer should know it automaticially if the value changed. So something (which I don't know) is missing, some statement in the LanguageModel to "feed" the ObservableValue with a new value.

(Sorry for my bad english.)

Luca Nate Mahler
  • 1,162
  • 2
  • 11
  • 27
  • Hey Luca see [JavaFX properties wrapping bean](http://stackoverflow.com/questions/23522130/javafx-properties-wrapping-bean). – Uluk Biy May 22 '14 at 16:53
  • I could solve it :) Yes I used SimpleStringProperties and changed some code... Later I will post the solution here. – Luca Nate Mahler May 23 '14 at 12:09

0 Answers0