监听器执行多次的效果

时间:2016-01-09 18:47:37

标签: java libgdx actionlistener

当我第一次单击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);
    }
});

2 个答案:

答案 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听众都会表现得像它被点击了。您可能希望捕获其他一些事件,例如mouseReleasedmouseLeave来处理isSbNationalityClicked标志的值。