#java #javafx #properties #binding
#java #javafx #свойства #привязка
Вопрос:
Мне нужно вычислить сумму нескольких полей ввода текста. Довольно прямолинейно, но я уже несколько часов борюсь с правильным преобразованием и приведением.
У меня есть несколько текстовых полей, и мне нужно привязать их текстовые свойства к SimpleIntegerProperties или, по крайней мере, я думаю, чтобы окончательно вычислить их сумму. Это то, с чем я застрял в прошлом:
IntegerProperty value = new SimpleIntegerProperty();
NumberStringConverter converter = new NumberStringConverter();
TextField textField = new TextField();
textField.textProperty().addListener(
new ChangeListener<String>() {
@Override
public void changed(
ObservableValue<? extends String> observable,
String oldValue, String newValue) {
if (!newValue.matches("[1-9]\d{0,3}")) {
textField.setText(oldValue);
}}});
value.bindBidirectional(textField.textProperty(), converter);
Я видел решения, использующие конвертер в качестве аргумента для двунаправленной привязки, но он выдает ошибку, в которой говорится, что это слишком много аргументов.
Я также пробовал value.bindBidirectional(converter.fromString(textField.textProperty().get()));
, что тоже не работает. На этот раз это число не может быть преобразовано в свойство Number.
Это вопрос домашнего задания, но ни изучение предоставленного материала, ни документации не продвинули меня дальше за последние 3 часа, отсюда и сообщение. Мы должны использовать текстовые поля, двунаправленную привязку, simpleIntegerProperties и NumberStringConverter .
Комментарии:
1. Что именно вы пытались, когда получили «слишком много аргументов»? Вы использовали
Bindings.bindBidirectional(Property,Property,StringConverter)
? И почему вы должны использовать двунаправленные привязки? Должны ли этиIntegerProperty
s быть частью какой-либо модели?2. Это говорит об этом
IntegerProperty cannot apply method bindBidirectional. Required: <Property>Number. Found: StringProperty, NumberStringConverter
. Я тоже пробовал, но это не сработало. Но я не помню почему. Я тоже задавался этим вопросом. Мы еще не узнали о моделях, я полагаю3. Обратите внимание, что метод bindBidirectional, который вы должны использовать, является не методом
value
, а скорее статическим методом класса привязок JavaFX.4. в реальном случае вы должны использовать TextFormatter, который использует NumberFormat, чтобы решить, является ли ввод текстового поля допустимым, а затем при необходимости привязать его значение к любому внешнему целому числу. Просто придирка, которую нужно запомнить на потом 🙂
Ответ №1:
Так что, по-видимому, это value.bindBidirectional(textField.textProperty(), converter);
не работает. Это, однако, делает: textField.textProperty().bindBidirectional(value, converter);
Комментарии:
1. рад, что вы нашли решение — документ api очень полезен, я полагаю 🙂 На самом деле, я не знал о методе привязки StringProperty к bidi, который использует конвертер, поэтому спасибо за предоставление моего учебного материала дня 🙂