Ejemplo un evento de selección de una fila de una tabla.
Primero la clase del evento:
public class EventoSeleccionTabla extends EventObject
{
/** Fila seleccionada en la tabla. */
private int filaSeleccionada;
/**
* Constructor de la clase.
* @param obj Componente Tabla que provoca el evento.
* @param fila Fila seleccionada en la tabla.
*/
public EventoSeleccionTabla(Object obj, int fila) {
super(obj);
this.filaSeleccionada = fila;
}
/**
* Devuelve la fila seleccionada de la tabla.
* @return Fila seleccionada de la tabla
*/
public int getFilaSeleccionada()
{
return filaSeleccionada;
}
}
Segundo la interfaz a implementar por todas las ventanas que quieran implementar selección de tablas:
public interface ListenerSeleccionTabla extends EventListener
{
/**
* Captura del evento de selección sobre la tabla.
* @param evt Evento de selección sobre la tabla.
*/
public void capturarEventoSeleccionTabla(EventoSeleccionTabla evt);
}
Tercero propagar el evento, para ello una clase que implementa ListSelectionListener:
public class MiTablaListSelectionListener implements ListSelectionListener
{
/** Puntero al componente tabla. */
private JTable tabla = null;
/**
* Constructor de la clase que recibe el componente tabla.
* @param t Componente tabla.
*/
public MiTablaListSelectionListener (JTable t)
{
super();
tabla = t;
}
public void valueChanged(ListSelectionEvent e)
{
if (e.getValueIsAdjusting())
{
return;
}
ListSelectionModel model = (ListSelectionModel) e.getSource();
if (!model.isSelectionEmpty())
{
int fila = model.getMinSelectionIndex();
tabla.lanzarEventoSeleccionTabla(fila);
}
else
// No hay filas seleccionadas, Fila -1
tabla.lanzarEventoSeleccionTabla(-1);
}
}
Cuarto el componente tabla debe guardar una referencia al listener, publicar el método lanzarEventoSeleccionTabla para lanzar el evento y añadir el listener de selección:
public class MiTabla extends JTable
{
/** Referencia al Evento de selección. */
private ListenerSeleccionTabla listenersSeleccionTabla;
public MiTabla()
{
super();
this.getSelectionModel().addListSelectionListener( new MiTablaListSelectionListener(this));
}
/**
* Añade un Listener de selección a la tabla.
* @param listener ListenerSeleccionTabla
*/
public void addListenerSeleccionTabla(ListenerSeleccionTabla listener) {
listenerSeleccionTabla = listener;
}
/**
* Lanza el Listener de selección de la tabla
* @param fila Fila seleccionada en la tabla.
*/
public void lanzarEventoSeleccionTabla(int fila) {
if (listenerSeleccionTabla != null)
{
listenerSeleccionTabla.capturarEventoSeleccionTabla(new EventoSeleccionTabla(this, fila));
}
}
}
Quinto capturar el evento en una ventana con un MiTabla dentro
public class Prueba implements ListenerSeleccionTabla
{
miTabla.addListenerSeleccionTabla(this);
public void capturarEventoSeleccionTabla(EventoSeleccionTabla evt)
{
if (evt.getFilaSeleccionada() != -1)
{
// Aquí haces tu código con la fila seleccionada
}
}
}
Parece complicado, pero al fin y al cabo todos los eventos son iguales o pareceidos al ejemplo que te he puesto. Debes tener en cuenta que en el ejemplo que te he puesto, sólo hay un listener de seleccón dentro de cada componente tabla, si quieres varios deberias guardar una lista y en lanzarEventoSeleccionTabla, recorrer esa lista para lanzarlos todos.
Espero que te sirva, si tienes dudas me lo comentas.
Un Saludo, Chema.