2016-07-16 276 views
1

我需要一些帮助。我有一个ArrayListTextfield 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

我在想,我会将这个问题标记为重复,因为您有一个完全相似的问题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

注意,你可以更有效地访问索引中的第一个例子= i;'在添加侦听器之前。 –

+0

你是完全正确的,答案已更新。 – DVarga