当我第一次单击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 :(得分:2)
您的侦听器在每次点击事件中都会注册一个新的侦听器,这就是您获得重复操作的原因。
它会使您使用的ClickListener
具有keyTyped
方法,这是您感兴趣的方法(键入事件),而不是单击事件本身,所以请尝试以下方法:
addListener(new ClickListener() {
@Override
public boolean keyTyped(InputEvent event, char character) {
auto.CreateAutoComplete(sbNationality, character);
return super.keyTyped(event, character);
}
});
答案 1 :(得分: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
标志的值。