我面临的情况是,两个文本字段分别具有两个独立的侦听器。
TextField customerId和TextField customerName。
1000莫汉
1002米通
我试图在填充一个文本字段时自动更新其他文本字段,例如,如果填充了customerId 1000,则将相应的客户名mohan更新为文本字段customerName;如果填充了mohan,则其客户ID 1000,将被填充到customerId文本字段中我正在使用地图,问题是当一个文本字段填充其侦听器时被调用,它调用了相同的文本字段侦听器,这导致循环最终以很多错误结束。我该怎么办?
最小的例子
Map<String, String> treeMapCustomerName,treeMapCustomerId;
treeMapCustomerName=new TreeMap<String,String>();
treeMapCustomerId=new TreeMap<String,String>();
String customerName="mohan";
String customerId="1000";
treeMapCustomerId.put("1000","Mohan");
treeMapCustomerId.put("1002","Mithun");
treeMapCustomerName.put("Mohan","1000");
treeMapCustomerName.put("Mithun","1002");
customerName.textProperty().addListener((observable, oldValue, newValue) -> {
customerId.setText(treeMapCustomerName.get(customerName));//immediately customerId textfield listener is triggered which will trigger this listener causing cycles
});
customerId.textProperty().addListener((observable, oldValue, newValue) -> {
customerName.setText(treeMapCustomerId.get(customerId));
});
最佳答案
您没有利用新值,而是使用控件访问地图,该控件将在运行时引发错误
您可以检查地图是否包含您的密钥,并且仅更新另一个文本字段(如果存在),如下所示:
customerName.textProperty().addListener((observable, oldValue, newValue) -> {
if(treeMapCustomerName.containsKey(newValue)){
customerId.setText(treeMapCustomerName.get(newValue));
}
});
customerId.textProperty().addListener((observable, oldValue, newValue) -> {
if(treeMapCustomerId.containsKey(newValue)){
customerName.setText(treeMapCustomerId.get(newValue));
}
});
这样可以避免在输入完整的ID /用户名之前检查地图的问题,但这不会解决输入的值是另一个子字符串的问题。
例如。如果地图包含id的100、1000、10000,并且您不希望在用户键入10000时显示其中的每一个,则可能需要其他控件(例如按钮)而不是使用属性
关于java - javaFX文本字段和监听器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37621008/