Я играю с JavaFX и пытаюсь создать графический интерфейс, который сохраняет свое состояние сразу после изменения.JavaFX: двунаправленное связывание не обновляет TextField
Класс UiState инкапсулирует все свойства:
public class UiState {
private static final Preferences PREFS = Preferences.userNodeForPackage(UiState.class);
public static final StringProperty FOLDER_PROP_STATISTICS = new BindingProperty("FOLDER_PROP_STATISTICS",
"C:\\Temp\\");
//This is a Stringproperty, which accesses the Preferences
protected static class BindingProperty extends SimpleStringProperty {
private final String def;
private final String bindingName;
public BindingProperty(final String bindingName) {
this(bindingName, "");
}
public BindingProperty(final String bindingName, final String def) {
this.def = def;
this.bindingName = bindingName;
}
@Override
public String get() {
return PREFS.get(bindingName, def);
}
@Override
public void set(final String newValue) {
PREFS.put(bindingName, newValue);
}
}
Графический интерфейс создается следующим образом:
protected void configFileComponents() {
final TextField folderTextField = getPropertyTextFieldWithLabel("Target folder", UiState.FOLDER_PROP_STATISTICS);
folderTextField.setOnMouseClicked(target -> {
onFileChooseButtonClicked();
});
}
private void onFileChooseButtonClicked() {
final DirectoryChooser chooser = new DirectoryChooser();
chooser.setTitle("Select target folder");
final String folder = getFolderProperty().get();
if (!(folder == null || folder.isEmpty())) {
chooser.setInitialDirectory(new File(folder));
}
final File result = chooser.showDialog(getScene().getWindow());
if (result != null) {
getFolderProperty().set(result.getAbsolutePath());
}
}
protected TextField getPropertyTextFieldWithLabel(final String label, final StringProperty property) {
final Label fileLabel = new Label(label);
addLeft(fileLabel);
final TextField result = new TextField();
result.setText(property.get());
addRight(result);
//I thought this would be enough
result.textProperty().bindBidirectional(property);
return result;
}
После того, как папка выбрана с помощью DirectoryChooser
, то StringProperty FOLDER_PROP_STATISTICS
обновляется. Но TextField не отображает новое значение. Я что-то пропустил, или сделал я фундаментальную ошибку?
Ваш метод 'set' не запускает никаких ChangeListeners или InvalidationListeners. Как показывает ваша проблема, расширение StringProperty обычно не является хорошей идеей. Лучшей идеей является инициализация обычного StringProperty (или ObservableMap) из ключей и значений в вашем узле «Настройки» и добавление к нему слушателя, чтобы вы могли отражать изменения в этом узле «Настройки». – VGR
Большое спасибо. Все работает отлично сейчас :) – samjaf