style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Agregar eventos a array de JButton

que tal, tengo una duda o mas bien creo que no me viene ninguna idea..

la cuestión es la siguiente tengo un arreglo de JButton digamos:

JButton[] botones ;

for(int i=0;i<botones.length;i++)
{

.addMouseListener(new java.awt.event.MouseAdapter(){
               
            @Override
            public void mouseClicked(java.awt.event.MouseEvent evt)
            {
                botonesClick(evt);
            }
        });
}

Aqui es donde esta mi duda o mi falta de logica
y es que si le agrego el escuchador para el click en el metodo

private void botonesClick(java.awt.event.MouseEvent evt)
{
System.out.println("Click);
}

como puedo saber que boton es el que dio un click, por que si hace todo bien pero no se que boton fue el q mando el click..

alguien sabe? o no es la manera corecta esa de hacerlo..

les agradeceria la ayuda ..

...
Habia pensado darles a cada uno mediante
setActionCommand
el numero de i que va en curso del ciclo y a partir de ahi
mediante el metodo para actionComand saber que comando fue presionado, pero los metodos para action comand son publicos por lo que siento que po ahi no va la idea.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

MouseEvent.getSource() te

MouseEvent.getSource() te devuelve el botón que genero el click.

Imagen de genitalico

si eso había pensando, pero

si eso había pensando, pero aun sigo sin saber como obtener exactamente el boton, lo hice de la siguiente manera, descomponiendo todo el String que genera MouseEvent.getSource()
y saque el texto que tiene el boton, de esa manera se que boton fue el que hizo click, funciona pero se me hace bastante engorroso, hay aluna otra forma??
ahora y si tengo dos tablas.. y quiero saber a que tabla le hice el click, como se que tabla fue??
la verdad se me esta complicando..

para separar botones y tablas, lo hago con instanceof

y de ahi si es un boton separo los botones, pero en las tablas no encuentro la manera de saber que tabla fue..

mi idea seria por ejemplo, agregar a la tabla un setActionCommand("Tabla1), setActionCommand("Tabla2), y despues sabiendo si es tabla boton, hacer un cast

javax.swing.JTable tablas = (javax.swing.JTable) MouseEvent.getSource();
y despues digamos
tablas.getActionCommand() y asi saber si es "Tabla1" o "Tabla2", no si si estaria bien de esa manera o si es la correcta o hay otra forma mas eficiente y menos engorrosa??

saludos

Si, como le estas poniendo el

Si, como le estas poniendo el mismo "manejador" a todos, ahora tienes el problema de saber que hacer ( que acción tomar ) con el botón presionado.

En realidad no tienes problemas para obtener el botón que hizo click ( eso lo obtienes con getSource() ) sino saber que hacer.

Lo que puedes hacer es tener un mapa, de comandos donde la llave sea el nombre del botón y el valor la acción:

Map<String,Runnable> map = new HashMap();
map.put("salir", new Runnable(){ public void run() { System.exit(); } };
...
public void moseClicked( MouseEvent e ) {
    mapa.get( e.getActionCommand()  ).run();
}

Aunque te queda mas desacoplado el problema es el mismo, tienes que hacer un trazo entre boton y accion.

La alternativa es if;s

public void moseClicked( MouseEvent e ) {
     String comando = e.getActionCommand();
     if ( comando.equals("salir')  {  System.exit(0); }    
     if ( comando.equals("
...
    ...
}

Una alternativa que se me ocurre ( aunque sinceramente no se si se pueda y/o que tan complejo seria ) es que utilizando anotaciones dijeras que metodo corresponde a que comando:

JButton button = new JButton("salvar");
...

@Accion("salir")
public void someMethod() {
    System.exit();
}

Esto estoy seguro que es posible, pero no viene outof the box y habría que hacer alguna investigación al respecto, y quizá complicaría mas de lo necesario el código ( hay que procesar todas las anotaciones y luego crear el mismo mapa que mencionaba pero dinamicamento ).

Intenta hacer los if's y si son muchos, mejor ve empezando :)

No pongas código en el cuerpo del if, mas que la invocación al método a realizar.

Suerte

Imagen de genitalico

intentare con esas soluciones

intentare con esas soluciones aun que la verdad lo de las anotaciones se me hace algo tedioso...
por otro lado si tengo separado el manejador, esta en otra clase todos ellos, implemento los "eventos" todo con el fin de separar mi interfaz grafica y los eventos y no tenerlo en una misma clase todo, pero se esta complicando bastante cada vez que utilizo algun componente..

creo que lo mejor seria mantener todo en la misma clase de la interfaz grafica, lo quise hacer asi para poder mantener el codigo un poco mas limpio y organizado..

aun que supongo que de tanto instanciar y pasarle referencias de los elementos a la otra clase, creen que perjudicara en el rendimiento, me refiero en cuanto al uso de memoria y todo eso..

Esta bien que separes tu

Esta bien que separes tu codigo, pero debes de tenerlo separado donde se pueda / deba separar y no en funciones que van juntas.

Por ejemplo, en Java Swing, el UI y los event handlers pueden estar muy cerca uno del otro y lo que hacen es preparar los datos para que otra clase ( la de negocio ) pueda procesarlos.

Hablando de MVC, en Swing la V y la C van juntos. Y la M puede ir en otro lado.

A veces esta algo confuso porque los componentes en swing tienen sus propios modelos, o intentan tenerlos y si se intenta tener "el" modelo de negocio mapeado con el modelo del componente se hace un relajo.

En fin.. revisa este documento que es de bastante ayuda para que veas como es la arquitectura de swing ( que no es MVC propiamente dicha ) y quizá esto te ayude con tu problema actual.

http://web.archive.org/web/20080306052421/http://java.sun.com/products/j...

Si puedes escribir un ejemplo de como lo resolviste estaría muy bien que lo publicaras por acá. A veces hace falta precisamente eso, ejemplos de como resolver las cosas.

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">