Esiste un Listener che fa distinzione tra azione "vera" o "indotta"?

di il
6 risposte

Esiste un Listener che fa distinzione tra azione "vera" o "indotta"?

Buongiorno,
spiego meglio la mia domanda:
ho una JCombobox e mi chiedo se c'è modo di distinguere quando io materialmente cambio il suo valore scegliendo col menù a tendina oppure lo cambio attraverso il metodo setSelectedIndex
Vorrei eseguire codici diversi a seconda delle due eventualità.
Grazie in anticipo per l'aiuto!

6 Risposte

  • Re: Esiste un Listener che fa distinzione tra azione "vera" o "indotta"?

    zatarra ha scritto:


    mi chiedo se c'è modo di distinguere quando io materialmente cambio il suo valore scegliendo col menù a tendina oppure lo cambio attraverso il metodo setSelectedIndex
    Di per sé no, in generale con i listener non c'è questa distinzione, cioè non è distinguibile.

    zatarra ha scritto:


    Vorrei eseguire codici diversi a seconda delle due eventualità.
    Cerca se possibile di evitare questa distinzione. Magari spiega meglio il perché ..
  • Re: Esiste un Listener che fa distinzione tra azione "vera" o "indotta"?

    Un'idea potrebbe essere settare un boolean nel metodo in cui chiami setSelectedIndex(). Quando la callback del listener viene scatenata dal cambio di valore della combo box fai il controllo sul boolean
  • Re: Esiste un Listener che fa distinzione tra azione "vera" o "indotta"?

    Mattia541993 ha scritto:


    Un'idea potrebbe essere settare un boolean nel metodo in cui chiami setSelectedIndex(). Quando la callback del listener viene scatenata dal cambio di valore della combo box fai il controllo sul boolean
    Scusa ma .. sinceramente non ho capito il senso di quello che hai detto.

    EDIT: ok, credo di aver capito. Tieni un tuo flag che dice se stai eseguendo il setSelectedIndex(), così nel listener "sai" se l'evento deriva da setSelectedIndex oppure no.
    Tecnicamente funziona ... un po' bruttino.
  • Re: Esiste un Listener che fa distinzione tra azione "vera" o "indotta"?

    Esattamente. Tu come lo faresti?
  • Re: Esiste un Listener che fa distinzione tra azione "vera" o "indotta"?

    Mattia541993 ha scritto:


    Esattamente. Tu come lo faresti?
    Innanzitutto c'è da precisare una cosa: la logica che hai detto e che ho capito, la puoi fare solo se tieni tu esternamente un "flag" che imposti a true poco prima di invocare setSelectedIndex e poi appena dopo lo rimetti a false. E lo dovresti fare appunto ogni volta che "sai" di dover invocare esplicitamente setSelectedIndex.
    Se lo fai per un solo combobox, potrebbe anche essere accettabile. Se hai bisogno di farlo per svariate combobox ... allora no, bisognerebbe "incapsulare" meglio questa logica, ovvero estendendo JComboBox.

    Il punto è che estendendo JComboBox, NON puoi ridefinire banalmente il setSelectedIndex per mettere questa logica al suo interno. Perché il setSelectedIndex viene comunque invocato in automatico a seguito degli eventi causati dall'utente, quindi non potresti fare la distinzione che pensavi. La soluzione è tutto sommato semplice: se si estende JComboBox si può definire un NUOVO metodo es. setExplicitSelectedIndex in cui metti quella logica.
    Ovvero, esempio:
    class MyComboBox<E> extends JComboBox<E> {
        private boolean explicitSetSelectedIndex;
    
        // .... eventuali costruttori .....
    
        public void setExplicitSelectedIndex(int anIndex) {
            explicitSetSelectedIndex = true;
            setSelectedIndex(anIndex);
            explicitSetSelectedIndex = false;
        }
    
        public boolean isExplicitSetSelectedIndex() {
            return explicitSetSelectedIndex;
        }
    }
    Quindi il setSelectedIndex viene comunque invocato a seguito degli eventi causati dall'utente. Ma tu "programmaticamente" andrai ad usare il nuovo setExplicitSelectedIndex. E questo ti permette di distinguere se il cambio dell'indice lo fai tu programmaticamente oppure lo richiede l'utente agendo sul combobox.
  • Re: Esiste un Listener che fa distinzione tra azione "vera" o "indotta"?

    Cosí é molto più elegante
Devi accedere o registrarti per scrivere nel forum
6 risposte