2016-01-09 7 views
2

Когда я впервые нажимаю SelectBox и набираю некоторый ключ, мой метод CreateAutoComplete выполняется один раз. Когда я не фокусирую SelectBox и снова нажимаю и набираю какой-то ключ, тогда метод выполняется два раза. Следующие три раза ... четыре ...Эффект прослушивателя выполняется несколько раз

Конечно, я хочу только один раз каждый раз.

private SelectBox<String> sbNationality; 
private AutoComplete auto = new AutoComplete(); 
... 
sbNationality.addListener(new ClickListener() { 
    @Override 
    public void clicked(InputEvent event, float x, float y) { 
     addListener(new ClickListener() { 
      @Override 
      public boolean keyTyped(InputEvent event, char character) { 
       auto.CreateAutoComplete(sbNationality, character); 
       return super.keyTyped(event, character); 
      } 
     }); 
     super.clicked(event, x, y); 
    } 
}); 
+0

Единственное, что делает ваш слушатель в 'sbNationality', назначает другой слушатель, предположим, ваш объект класса. Таким образом, каждый клик добавляет еще один прослушиватель для действия «keyTyped». Почему бы вам просто не добавить этого внутреннего слушателя нормально, не помещая его в дополнение к другому слушателю? – AndrewMcCoist

+0

Можете ли вы показать мне, что делать? Как добавить метод keyTyped в щелчок? – coh

ответ

1

Вот простой пример , скорее всего, не соответствует вашим требованиям, но должен дать вам общую идею.

// Add this field as a flag for you to know whether the sbNationality has been clicked or not. 
private Boolean isSbNationalityClicked = false; 



// On click, set the flag to true 
sbNationality.addListener(new ClickListener(){ 
    @Override 
    public void clicked(InputEvent event, float x, float y){ 
     isSbNationalityClicked = true; 
     super.clicked(event, x, y); 
    } 
}); 


addListener(new ClickListsner(){ 
    @Override 
    public boolean keyTyped(InputEvent, char characer){ 
     // if you caught the keyTyped event and the flag is true - perform your desired action 
     if(isSbNationalityClicked){ 
      auto.CreateAutoComplete(sbNationality, character); 
      // set flag to false, since the desired action has been executed 
      // you might want to set flag to false in some other cases as well, 
      // like mouseReleased or mouseLeave 
      isSbNationalityClicked = false; 
      return super.keyTyped(event, character); 
     } 
    } 
}); 

Используя код выше, как только ваш sbNationality получает щелкнул, он будет установить флаг true, поэтому независимо от того, что вы делаете в то время, keyTyped слушатель не будет действовать, как он нажал. Вы можете захотеть поймать некоторые другие события, такие как mouseReleased или mouseLeave, чтобы обрабатывать значение isSbNationalityClicked.

2

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

Это SemS что ClickListener вы используете, имеет keyTyped метод, который является то, что вы (ключ напечатал событие) интересов, а не событие щелчка сам по себе, так что попробуйте это:

addListener(new ClickListener() { 

      @Override 
      public boolean keyTyped(InputEvent event, char character) { 
       auto.CreateAutoComplete(sbNationality, character); 
       return super.keyTyped(event, character); 

      } 
}); 
+0

Итак, как отредактировать мой код? – coh

+0

Я только что предложил часть кода, пожалуйста, посмотрите. – Berger

+0

Этот код не работает. Мой метод CreateAutoComplete не выполняется, когда я нажимаю клавишу. – coh

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