Двунаправленные привязки разных свойств

Я просто попытался связать свойство Integer и String. После некоторого поиска в Google это должно быть возможно с одним из двух предоставленных методов:

  1. public static void bindBidirectional (Свойство stringProperty,
    Свойство otherProperty, конвертер StringConverter)

  2. public static void bindBidirectional (Свойство stringProperty,
    Свойство otherProperty, формат java.text.Format)

К сожалению, это не похоже на работу для меня. Что я делаю неправильно?

import java.text.Format;

import javafx.beans.binding.Bindings;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.util.converter.IntegerStringConverter;

public class BiderectionalBinding {

    public static void main(String[] args) {
        SimpleIntegerProperty intProp = new SimpleIntegerProperty();
        SimpleStringProperty textProp = new SimpleStringProperty();

        Bindings.bindBidirectional(textProp, intProp, new IntegerStringConverter());

        intProp.set(2);
        System.out.println(textProp);

        textProp.set("8");
        System.out.println(intProp);    
    }
}

4 ответа

Простой вопрос типа путаницы

Bindings.bindBidirectional(textProp, intProp, new IntegerStringConverter());

Должно быть:

Bindings.bindBidirectional(textProp, intProp, new NumberStringConverter());

У меня была похожая проблема. Я попытался преобразовать строку в File-Object и обратно. Но я использовал Bindings.bindBidirectional(...,...,java.text.Format). Преобразование из строки в файл работало как ожидалось, но в другом направлении результат был нулевым. Я попробовал это на вашем примере, тот же результат! Я думаю, что есть ошибка в механизме привязки, или, возможно, моя реализация java.text.Format неверна..

package de.ludwig.binding.model;

import java.text.FieldPosition;
import java.text.Format;
import java.text.ParsePosition;

import javafx.beans.binding.Bindings;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;

public class BidirectionalBinding {

    public static void main(String[] args) {
        SimpleIntegerProperty intProp = new SimpleIntegerProperty();
        SimpleStringProperty textProp = new SimpleStringProperty();

        Bindings.bindBidirectional(textProp, intProp, new Format() {

            @Override
            public StringBuffer format(Object obj, StringBuffer toAppendTo,
                    FieldPosition pos) {
                return toAppendTo.append(obj.toString());
            }

            @Override
            public Object parseObject(String source, ParsePosition pos) {
                return Integer.parseInt(source);
            }

        });

        intProp.set(2);
        System.out.println(textProp);

        textProp.set("8");
        System.out.println(intProp);    
    }
}

Единственный способ заставить все работать так, как ожидалось, заключался в реализации StringConverter в соответствии с рекомендациями Хендрика Эбберса. Спасибо за этот совет!

Я попробовал ваш код в Eclipse и должен был привести конвертер. Тогда все выглядит хорошо:

public class BiderectionalBinding {

    public static void main(String[] args) {
        SimpleIntegerProperty intProp = new SimpleIntegerProperty();
        SimpleStringProperty textProp = new SimpleStringProperty();
        StringConverter<? extends Number> converter =  new IntegerStringConverter();

        Bindings.bindBidirectional(textProp, intProp,  (StringConverter<Number>)converter);

        intProp.set(2);
        System.out.println(textProp);

        textProp.set("8");
        System.out.println(intProp);    
    }
}

Выход:

StringProperty [значение: 2]

IntegerProperty [значение: 8]

Я думаю, что это ошибка. В любом случае вы можете обойти, как:

StringConverter sc = new IntegerStringConverter();
Bindings.bindBidirectional(textProp, intProp, sc);
Другие вопросы по тегам