Foros del Web » Programación para mayores de 30 ;) » Java »

Como aceder a componentes de un jpanel

Estas en el tema de Como aceder a componentes de un jpanel en el foro de Java en Foros del Web. Hola a todo@s, Tengo una interfaz que tiene un JTabBedPaned, el numero de tabs que presenta el panel lo creo dinámicamente (inicialmente se genera un ...
  #1 (permalink)  
Antiguo 16/06/2008, 08:40
 
Fecha de Ingreso: noviembre-2007
Mensajes: 121
Antigüedad: 16 años, 5 meses
Puntos: 0
Como aceder a componentes de un jpanel

Hola a todo@s,

Tengo una interfaz que tiene un JTabBedPaned, el numero de tabs que presenta el panel lo creo dinámicamente (inicialmente se genera un tab por cada grupo que hay creado en una tabla de base de datos, pero puedo ir creando o eliminando nuevos grupos en tiempo de ejecución con lo cual pueden aparecer o desaparecer tabs en el jtabbedpane). Todos esos tabs estan formados por los mismos componentes, una jtable y tres botones. Para general esos tabs tengo una función que es la siguiente:

private JPanel genaralPanelGrupo(String nombreGrupo) {

JPanel lista;
JTable lista_contactos;
JScrollPane contenedor_listaScroll;
JButton añadirContacto;
JButton buscarContacto;
JButton eliminarContacto;
ContactosJTable table;
ContactosJTablaModel myModel;


lista=new JPanel();
GroupLayout listaLayout = new GroupLayout(lista);
lista.setLayout(listaLayout);

myModel = new ContactosJTablaModel(conexion,nombreGrupo);

lista_contactos = new ContactosJTable(myModel);


contenedor_listaScroll=new JScrollPane(lista_contactos);
contenedor_listaScroll.setBorder(BorderFactory.cre ateTitledBorder("Listado"));


contenedor_listaScroll.setVerticalScrollBarPolicy( ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
contenedor_listaScroll.setHorizontalScrollBarPolic y(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEED ED);


añadirContacto=new JButton("+Fila");
añadirContacto.setAction(addNewLine());
buscarContacto=new JButton("Buscar");
eliminarContacto=new JButton("Borrar");
eliminarContacto.setAction(removeLine());
.....aqui distribuyo los componentes en el layout....

return lista;


}

Cada tab que genero tiene su propio titulo de pestaña y su tabla con su moledo y sus botones. El problema que tengo es que cuando se pusla sobre los botones, por ejemplo el de añadirContacto, la acción que se realiza es la misma, añadir una línea a la tabla sea cual sea el tab (sólo que la tabla a la que se añade no es la misma, depende del tab que ha generado el evento). El codigo de la accion es el siguiente:

private AbstractAction addNewLine() {
if(accionNuevaLinea == null) {
accionNuevaLinea = new AbstractAction("+Fila",null) {
public void actionPerformed(ActionEvent evt) {

myModel.addNewRow();

}
};
}
return accionNuevaLinea;
}


EL PROBLEMA que tengo es que no puedo poner myModel.addNewRow(), porque myModel es una variable que se encuentra dentro del panel que forma el tab, y que hace referencia a distintos componentes en función del tab en el que estemos (ya que cada tab tiene su tabla y su modelo). ¿Hay alguna manera de conocer mediante la fuente que produce el evento, cual es el panel que lo contiene y acceder a la variable mymodel de dicho panel ?

Espero haberme explicado con claridad sino me lo dicne y intento explicarme mejor.

Una idea que se me ocurrio que no se si es beuna es generarme una clase que extiende jpanel y que sea precisamente el panel con esos componentes, y añadirle una funcion que sea obtenermodelo o algo asi, de manera que en la acción, obtuviera el panel que engloba el boton que generó el evento y luego obtener el modelo, pero no se si funcionaria. Espero me puedan echar un cable

Gracias
  #2 (permalink)  
Antiguo 16/06/2008, 09:29
 
Fecha de Ingreso: noviembre-2007
Mensajes: 121
Antigüedad: 16 años, 5 meses
Puntos: 0
Respuesta: Como aceder a componentes de un jpanel

He intentado hacerlo de la siguiente manera:

private AbstractAction addNewLine() {
if(accionNuevaLinea == null) {
accionNuevaLinea = new AbstractAction("+Fila",null) {
public void actionPerformed(ActionEvent evt) {
//necesitamos saber en que panel está el boton que genero el evento para llamar a su modelo
Container panelGrupo=((JComponent)evt.getSource()).getParent ();
Component ScrollContactos =panelGrupo.getComponent(0);
Component Tabla= ((JScrollPane)ScrollContactos).getComponent(0);
TableModel myModel=((ContactosJTable)Tabla).getModel();
((ContactosJTablaModel)myModel).addNewRow();


}
};
}
return accionNuevaLinea;
}

El problema es que el getComponent del Scrolpane devuelve un jviewport que no se puede convertir en table. ¿Como puedo obtener el componente que encierra un jscrollpane?en mi caso la tabla?
  #3 (permalink)  
Antiguo 16/06/2008, 11:41
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Respuesta: Como aceder a componentes de un jpanel

Hola:

JViewport es otro JComponent que posiblmente tenga dentro el JTable. Quizás el método getView() te lo devuelta (tendrás que probar).

De todas formas, quizás quedaría más limpio hacer una única Action, pero que reciba en el constructor el modelo de tabla sobre el que tiene que operar. De esta forma, instanciarás varias veces la misma Action, cada una con un modelo de tabla distinto, pero reaprovechas el código del Action.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #4 (permalink)  
Antiguo 16/06/2008, 12:16
 
Fecha de Ingreso: noviembre-2007
Mensajes: 121
Antigüedad: 16 años, 5 meses
Puntos: 0
Respuesta: Como aceder a componentes de un jpanel

Muchas gracias,justo acababa de averiguar ese método y sí que funciona.Lo que me comentas de reutilizar el action ya lo hacia, de echo lo que hago es que solo tengo un action y ahí miro que componente lo provocó obtengo su panel y de ahí el jscrollpanel, el jviewport y la tabla, y con el modelo de la tabla llamo al métdo correspondiente.

Muchas gracias

Saludos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:53.