JavaFX:双向绑定不会更新TextField

时间:2016-03-18 17:30:30

标签: java javafx

我正在玩JavaFX并尝试创建一个GUI,在更改后立即保存其状态。

类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);

        }

    }

GUI的创建方式如下:

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不显示新值。我错过了什么,还是犯了一个根本性的错误?

1 个答案:

答案 0 :(得分:1)

VGR是对的,覆盖get()和set()BindingProperty是天真的。我的新班级看起来像这样,就像一个魅力:

protected static class BindingProperty extends SimpleStringProperty {

    public BindingProperty(final String bindingName, final String def) {
        super(PREFS.get(bindingName, def));
        this.addListener(
                (ChangeListener<String>) (observable, oldValue, newValue) -> PREFS.put(bindingName, newValue));
    }

    public BindingProperty(final String bindingName) {
        this(bindingName, "");
    }

}
相关问题