2016-07-16 4 views
1

Мне нужна помощь. У меня есть ArrayList от Textfield s.JavaFX TextField прослушиватель

static List<TextField> lfLetters = new ArrayList<>(); 

И я хочу проверить, изменилось ли значение. И если бы я хотел знать, в каком текстовом поле это было. Я знаю, что могу сделать это с помощью Listener, но это работает только для одного.

TextField textField = new TextField(); 
textField.textProperty().addListener((observable, oldValue, newValue) -> { 
    System.out.println("textfield changed from " + oldValue + " to " + newValue); 
}); 

Я хочу, чтобы он работал над массивом и определял, какое текстовое поле изменилось.

Заранее благодарен!

ответ

2

Вы можете использовать ObservableList с соответствующим экстрактор и добавить слушателя непосредственно к списку. Таким образом, он будет автоматически наблюдать за изменениями в указанных свойствах своих элементов. Это более удобно, чем добавление слушателя каждого текстового поля, но в этом случае вы не можете получить старое значение:

ObservableList<TextField> oList = 
     FXCollections.observableArrayList(tf -> new Observable[]{tf.textProperty()}); 

    oList.addListener((ListChangeListener.Change<? extends TextField> c) -> { 
     while (c.next()) { 
      if (c.wasUpdated()) { 
       for (int i = c.getFrom(); i < c.getTo(); ++i) { 
        System.out.println("Updated index: " + i + ", new value: " + c.getList().get(i).getText()); 
       } 
      } 
     } 
    }); 
1

Я думал, что отмечу этот quesiton как дубликат, так как у вас есть совершенно аналогичный вопрос here.

Но, в конце концов, вы хотите иметь ссылку на TextField также в слушателе, поэтому я добавлю ответ.

Этот фрагмент добавляет 10 TextField объектам к ArrayList и добавляет слушателя каждому из них.

for (int i = 0; i < 10; i++) { 
    TextField tf = new TextField(); 
    final int index = i; 
    tf.textProperty().addListener((obs, oldVal, newVal) -> { 
     System.out.println("Text of Textfield on index " + index + " changed from " + oldVal 
       + " to " + newVal); 
    }); 
    lfLetters.add(tf); 
} 

Или, если ваш ArrayList уже инициализирована, вы можете iterate through это просто:

lfLetters.forEach(tf -> { 
    tf.textProperty().addListener((obs, oldVal, newVal) -> { 
     System.out.println("Text of Textfield on index " + lfLetters.indexOf(tf) + " changed from " + oldVal 
       + " to " + newVal); 
    }); 
}); 

Пример вывода

Text of Textfield on index 2 changed from InitialText - 2 to ModifiedText - 2 
Text of Textfield on index 6 changed from InitialText - 6 to ModifiedText - 6 
+0

Примечание Вы можете получить доступ к индексу более эффективно в первом примере, просто делая 'конечный индекс Int = i; 'непосредственно перед добавлением слушателя. –

+0

Вы совершенно правы, ответ обновлен. – DVarga

 Смежные вопросы

  • Нет связанных вопросов^_^