Двунаправленные привязки разных свойств
Я просто попытался связать свойство Integer и String. После некоторого поиска в Google это должно быть возможно с одним из двух предоставленных методов:
public static void bindBidirectional (Свойство stringProperty,
Свойство otherProperty, конвертер StringConverter)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);