2009-09-15 18 views
24

¿Cómo puedo detectar cuándo se cambia un JRadioButton de 'no seleccionado' a 'seleccionado' cuando se hace clic con el mouse? He intentado usar un ActionListener en el botón, pero se dispara cada vez que se hace clic en el botón de radio, no solo cuando está cambiando el estado a 'seleccionado'.Detección de un cambio de estado de JRadioButton

He pensado en mantener una variable booleana que recuerda el estado del botón, y probarlo dentro del ActionListener para ver si cambia su estado, pero me pregunto si hay una solución mucho mejor o más limpia.

+0

Sí, un ActionListner suele ser la forma en que se hace. Todo el mundo sabe cómo escribir un ActionListener porque es muy común. El código simplemente simplemente usaría el método isSelected() del botón. ItemListener también se dispara varias veces, por lo que debe verificar el evento ItemEvent para ver si este evento fue seleccionado o deseleccionado. Me quedaría con el enfoque más común. – camickr

+0

El uso de un ActionListener como este todavía no funciona, ya que isSelected() devuelve verdadero cada vez que se hace clic en el botón de opción, que es el problema inicial. – cgull

+0

Funciona bien para mí usando JDK6 en XP. Si ChangeListener le dice que el estado ha cambiado, entonces es mejor cambiar el estado o tiene un gran problema. Publique su SSCCE mostrando el problema. – camickr

Respuesta

40

Mirar JRadioButton. addItemListener()

EDITAR: Es poco probable que desee utilizar un changeListener ya que se dispara varias veces por clic. Un itemListener se dispara solo una vez por clic. See here

EDIT2 EDIT2: Solo para ampliar esto, un ActionListener en un jradioButton se activará cada vez que un usuario haga clic en él, incluso si ya está seleccionado. si eso es lo que quieres, bien, pero me parece molesto. Solo quiero que se me notifique si está seleccionado o no seleccionado.

Un ChangeListener se activará para todo tipo de cosas, lo que significa que su oyente recibirá 5 o más eventos por clic. No está bien.

Un elemento oyente disparará solo si el estado seleccionado o no seleccionado cambia. Esto significa que un usuario puede hacer clic en él varias veces y no se disparará si no cambia. En el método de control que tendrá que tener un bloque de if comprobación de SELECTED o DESELECTED estado y hacer lo que hay:

@Override 
public void itemStateChanged(ItemEvent e) { 
    if (e.getStateChange() == ItemEvent.SELECTED) { 
     // Your selected code here. 
    } 
    else if (e.getStateChange() == ItemEvent.DESELECTED) { 
     // Your deselected code here. 
    } 
} 

Simplemente funciona mejor porque usted sabe que si usted está en el método, el botón de radio tiene cualquiera simplemente se ha seleccionado o deseleccionado, no es que el usuario simplemente esté golpeando la interfaz por algún motivo desconocido.

+2

Esto funciona a la perfección, a pesar de que la documentación de Sun indica "Normalmente, usted maneja los clics del botón de radio con un detector de acciones". ¡Gracias! – cgull

+0

Sería genial si pudieras agregar un oyente a un 'ButtonGroup' que solo se activaría una vez que se produzca un cambio' JRadioButton' dentro del grupo. – ryvantage

+0

@ Nemi Lo sentimos, pero el enlace de edición está muerto. ¿Puede proporcionarnos cómo usar este enfoque? –

0

Creo que desea agregar una implementación de ChangeListener.

+0

Como ya he mencionado en mi post, añadiendo un ChangeListener dispara múltiples veces por clic y es poco probable que la mejor opción. – Nemi

+0

Sí, incluso se activa cuando el puntero del ratón entra en "el territorio" sin hacer clic ... – FaithReaper

Cuestiones relacionadas