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.)