Avoid recalling a Listener

2

I am detecting the change of value of a group of buttons with Listener . If there is nothing selected I put the previous value before the change, but this causes me to redial the Listener How can I avoid it?

The code is:

toggleGroup.selectedToggleProperty().addListener(
    (ObservableValue<? extends Toggle> arg0, Toggle oldValue, Toggle newValue) -> {
        if (toggleGroup.getToggles().indexOf(toggleGroup.getSelectedToggle()) == -1) {                
                    toggleGroup.selectToggle(oldValue); // esto provoca rellamada al Listener
                }
            }
        ); 
    
asked by Oundroni 08.07.2016 в 12:35
source

2 answers

1

You can create a flag that indicates if you have tried to cancel all the options of toggleGroup :

boolean flag = false; // variable gobal

toggleGroup.selectedToggleProperty().addListener(
(ObservableValue<? extends Toggle> arg0, Toggle viejo, Toggle nuevo) -> {            

    if (flag){              
        flag = false;
        return;
    }           

    if (nuevo == null){                                                   
        flag = true;               
        toggleGroup.selectToggle(viejo);
        return;
    }

});            
    
answered by 11.07.2016 / 09:29
source
0

EDIT: what I describe below after the line seems incorrect. I put another answer.

If you save the value you are assigning in a global variable, you can avoid a second call:

String newValueAux = "";

toggleGroup.selectedToggleProperty().addListener(
(ObservableValue<? extends Toggle> arg0, Toggle oldValue, Toggle newValue) -> {
    if (toggleGroup.getToggles().indexOf(toggleGroup.getSelectedToggle()) == -1) {                
                if (oldValue != newValueAux) {
                     newValueAux = oldValue;
                     toggleGroup.selectToggle(oldValue);
                }
            }
        }
    ); 

I do not know how to avoid the callback to the listener when it is in its own declaration, but you can end this recursion with a base condition.

If oldValue = newValue then do not change anything and the listener will not be released:

toggleGroup.selectedToggleProperty().addListener(
(ObservableValue<? extends Toggle> arg0, Toggle oldValue, Toggle newValue) -> {
    if (toggleGroup.getToggles().indexOf(toggleGroup.getSelectedToggle()) == -1) {                
                if (oldValue != newValue) toggleGroup.selectToggle(oldValue);
            }
        }
    ); 
    
answered by 08.07.2016 в 12:42