2010-10-28 59 views
11

que creó una serie de JButtons con ActionListeners anónima y bajo ciertas condiciones Quiero eliminar todo el ActionListeners, pero el método requiere una .removeActionListenersActionListener como argumento. ¿Cómo voy a eliminar a los oyentes de acción?Java swing: Cómo eliminar un ActionListener anónima de un componente

for (int i=0; i < button.length; i++){ 
    button[i] = new JButton(); 
    button[i].addActionListener(listener.new ButtonListener()); 
} 
+0

(Solo tenga en cuenta que probablemente esta no sea una forma efectiva de diseñar lo que sea que intente hacer. Mejor dejar a los oyentes allí disparando, y tener algún control/polimorfismo después de eso para desactivar la acción (probablemente cambie de estado en lugar de deshabilitar).) –

Respuesta

2

No puede. Nadie tiene una referencia a esos objetos. Para poder eliminarlos, deberá almacenarlo como un miembro/variable de datos en su código y luego pasar esa variable al método removeActionListener(). Sin embargo, lo que podría hacer es utilizar el método getActionListeners() para obtener una matriz de todos los objetos ActionListener asociados con Button. A continuación, tendrá que averiguar cuál de ellos para eliminar, pero si sólo hay una, que debe ser fácil ;-)

17

Usted puede obtener con: getActionListeners método:

for(JButton currentButton: button) { 
    for(ActionListener al : currentButton.getActionListeners()) { 
     currentButton.removeActionListener(al); 
    } 
} 

No estoy seguro si lanzará un ConcurrentModificationException sin embargo.

+0

Probablemente no ... Estoy dispuesto a apostar que almacena internamente a los oyentes como una ArrayList y luego los copia en una matriz de ActionListeners para devolverlos. Curioso para ver si lo haría ... –

+0

Nadie devolvería una matriz interna, ¿o sí? (Que no cambia el tamaño de todos modos.) –

+0

for (ActionListener al: button.getActionListeners()) Eso no se compilará pero fue una buena idea –

3

Entiendo su pregunta, y como otros han sugerido, iterar a través de todas las acciones que los oyentes de la clase de cliente pueden resolver su problema inmediato.

  1. H/W en este caso, lo que realmente están tratando de hacer es extender la funcionalidad de un JButton, y que es una manera de abordar este problema - extender JButton y añadir un método llamado removeAllActionListeners() (que hace no tomar ningún parámetro).

    • Dentro de este método se puede repetir través de todos los oyentes de acción y eliminarlos. Creo que es mejor diseño si haces esto aquí que en la clase de cliente.
  2. Si no quiere hacer eso, entonces creo que la sugerencia de Tom Hawtin para usar el estado dentro de su ButtonListener es una buena idea.

  3. En su defecto, siempre tiene la opción de volver a caer de una manera muy "hacky", que es almacenar una colección de los oyentes de acción en su clase de cliente.

    • Map<JButton, ButtonListener> (si siempre hay solamente va a ser un oyente por botón), o
    • Map<JButton, List<ButtonListener>> (si es que puede haber múltiples oyentes por botón) es lo que podría utilizar.

Creo métodos y son preferibles, y el método indica un mal diseño (pero es mucho más fácil de hackear juntos).

Tenga en cuenta que, si de hecho utiliza el método , o algo similar, compruebe que los métodos o atributos de los que se accede son seguros para subprocesos (como se ha mencionado por OscarRyz), y si no, utilizar synchronized para garantizar la seguridad de hilo .

Cuestiones relacionadas