Domanda

Ho un editor JFace composto principalmente da un TreeViewer. Questo è collegato a ContentOutlinePage per dare vita alla vista Struttura.

Quando uno dei due riceve un SelectionChangedEvent chiamano gli altri setSelection() metodo ... e qui sta il problema. <=> genera un altro <=> ... e quindi il loop infinito viene unito.

Esiste un modo per dire se <=> è stato creato dall'interazione effettiva dell'utente anziché da un altro oggetto che chiama <=>?

Esiste ancora un modo migliore per fermare questo tipo di abbraccio mortale?

Indizi accolti.

È stato utile?

Soluzione

Generalmente, verificherebbe un flag all'inizio della routine per verificare se ci si trova nel mezzo del gestore eventi. Se il flag è impostato, si esce senza elaborazione.

Se il flag non è impostato, si imposta il flag, elabora, quindi si reimposta il flag.

Altri suggerimenti

Un altro modello che funziona è rimuovere il listener di eventi, effettuare la selezione, aggiungere nuovamente il listener di eventi. Questo assicura che ci sia un unico posto nel codice in cui devi preoccuparti di questo - con una bandiera dovresti mantenere simultaneamente due posti.

Inoltre, SelectionChangedChanged è possibilmente (non sicuro però) messo in cima allo stack degli eventi (cioè eseguito in modo asincrono). In tal caso, minimizzi anche il periodo durante il quale lo spettatore non propaga la notifica.

Nel complesso, trovo deludente che SelectionChangedEvent generato sia lo stesso, indipendentemente dal fatto che sia stato fatto clic su un mouse. Suppongo che non sia facile farlo come si potrebbe sperare. Una volta ho dovuto modificare un comportamento della classe dell'editor di testo in modo che fosse nuovo su due tipi di eventi insert (generati dall'utente e generati dalla rete) per rendere condivisa quella classe dell'editor di testo. Mi piacerebbe vedere più discussioni su questo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top