2016-01-09 60 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监听器会像它被点击。您可能想要捕获mouseReleasedmouseLeave等其他事件来处理isSbNationalityClicked标志的值。

2

监听程序,登记在每次点击事件的新听众,这就是为什么你得到重复的动作。

它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