2016-06-03 3 views
0

Я столкнулся с ситуацией, когда есть два текстовых поля с двумя отдельными слушателями для каждого из них.Текстовые поля и слушатели javaFX

TextField customerId и TextField имя_пользователя.

1000 мохан

1002 Митхун

Я пытаюсь автоматически обновлять другие текстовое поле, когда один текстовое поле заполняется, например, если CUSTOMERID 1000 заполнена, то соответствующее имя клиента Mohan обновляется в текст field customerName, и если mohan будет заполнен, то его идентификатор клиента 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)); 

     }); 
+1

Конечно, только ошибки вы могут получить здесь исключения с нулевым указателем, потому что вызовы, которые вы должны использовать для 'treeMapCustomerName.get (...)' и 'treeMapCustomerId.get (...)' должны возвращать 'null' (вы передаете текстовые поля в' get ', и вы никогда - не можете - сопоставляете любые значения на карте с текстовыми полями, поэтому' get() 'вызывает return' null'). –

+0

Да, вы правы, теперь исправлено –

+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/username, однако это не будет учитывать проблемы, когда вводимое значение является дополнительной строкой другого.

E.g. Если на карте были указаны идентификаторы 100, 1000, 10000, и вы не хотите, чтобы каждый из них отображался как пользовательский тип 10000, вам может понадобиться дополнительный элемент управления, например, кнопка вместо использования свойства

+0

Спасибо большое :) –