javaFX文本字段和侦听器

时间:2016-06-03 18:14:26

标签: java javafx binding

我面临的情况是,有两个文本字段,每个字段有2个独立的侦听器。

TextField customerId和TextField customerName。

  

1000 mohan

     

1002 mithun

我正在尝试在填写一个文本字段时自动更新其他文本字段,例如,如果填写了customerId 1000,则相应的客户名称mohan将更新为文本字段customerName,如果填充了mohan,则他的客户ID 1000将被填写customerId文本字段。我正在使用地图,问题是当一个文本字段填充其监听器被调用时,它回调相同的文本字段监听器,这导致循环最终以批量错误结束。我应该怎么做才能解决这个问题? / p>

最小的例子

    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));

        });

1 个答案:

答案 0 :(得分:1)

您没有利用新值,而是使用控件访问地图,这会在运行时抛出错误

您可以检查地图是否包含您的密钥,只更新其他文本字段(如果存在),如下所示:

            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 /用户名之前检查地图的问题,但是这不会考虑输入的值是另一个的子字符串的问题。

E.g。如果地图包含id为100,1000,10000,并且您不希望在用户键入10000时显示其中的每一个,您可能需要一个额外的控件,例如按钮而不是使用属性