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

[SOLUCIONADO] Adaptar largo y ancho de un jframe al de un jpanel

Estas en el tema de Adaptar largo y ancho de un jframe al de un jpanel en el foro de Java en Foros del Web. Hola, quiero saber como cambiar el largo y ancho del jframe al de un jpanel. Veras quiero usar el patron factory para fabricar paneles asi: ...
  #1 (permalink)  
Antiguo 24/01/2013, 15:41
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Adaptar largo y ancho de un jframe al de un jpanel

Hola, quiero saber como cambiar el largo y ancho del jframe al de un jpanel.
Veras quiero usar el patron factory para fabricar paneles asi:

package institutomymaster.vistas.util;
import javax.swing.JPanel;
public class FabricarAcciones
{
public JPanel fabricarPanelAcciones(String xaccion,String xtipo,Object obj)
{
if(xaccion.equals("Guardar") && xtipo.equals("Carrera") && obj==null)
return new AccionCarrera(xaccion,xtipo,null);
else
return null;
}
}

y del jframe:

public class frmAcciones extends javax.swing.JFrame
{
private String accion;
private String tipo;
private Object obj;
private JPanel objpanel;
public frmAcciones(String xaccion,String xtipo,Object xobj)
{
initComponents();
accion=xaccion;
tipo=xtipo;
obj=xobj;
this.setTitle(accion+" "+ tipo);
objpanel=FachadaVentanas.getInstance().fabricarPan elAcciones(accion, tipo, obj);
//this.pack();
this.mostrarPanel(objpanel);
}
private void mostrarPanel(JPanel xobjpanel)
{
this.superPanel.removeAll();
this.superPanel.add(xobjpanel);
this.superPanel.setLayout(new GridLayout());
this.setSize(xobjpanel.getWidth(),xobjpanel.getHei ght());
// this.setSize(491,137);
this.superPanel.updateUI();
}

y el largo y ancho no me genera y no se que hacer.

Espero una ayuda y una respuesta.
  #2 (permalink)  
Antiguo 24/01/2013, 16:08
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: Adaptar largo y ancho de un jframe al de un jpanel

El this.pack() tienes que hacerlo después de haber añadido el panel ... y funciona siempre y cuando no pongas Layout null.

Si no, frame.setSize(panel.getSize());

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #3 (permalink)  
Antiguo 25/01/2013, 10:18
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: Adaptar largo y ancho de un jframe al de un jpanel

hola chuidiang primero que gracias porque funcionó de maravillas lo q me dijiste.
Ahora quería preguntar por el botón volver

en un botón en el jframe lo hacía así:

this.dispose

pero ahora que el botón está en el jpanel y lo fabrico con el patrón factory cómo podré hacer el this.dispose desde el jpanel??

espero sus respuestas.
  #4 (permalink)  
Antiguo 25/01/2013, 11:23
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: Adaptar largo y ancho de un jframe al de un jpanel

¿Qué es el botón volver?

dispose() marca una ventana o panel para que sea liberada por el recolector de basura. En general no es buena técnica hacer dispose de las ventanas, ya que hay que ser muy cuidadoso liberando recursos para asegurarse que el recolector realmente se las lleva. Lo habitual es crearlas una única vez y ocultarlas o vislualizarlas a voluntad con setVisible(true|false).

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #5 (permalink)  
Antiguo 26/01/2013, 13:36
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: Adaptar largo y ancho de un jframe al de un jpanel

tengo ventanas hechas en java y los paneles los fabrico con el patron factory.
los botones están dentro del panel que fabrico o sea las ventanas no tienen mucho código excepto para fabricar los paneles.
dime se puede cerrar la ventana desde el panel fabricado???

espero sus respuestas.
  #6 (permalink)  
Antiguo 26/01/2013, 13:53
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: Adaptar largo y ancho de un jframe al de un jpanel

Sí, SwingUtilities.getWindowAncestor() te devuelve la ventana en la que está cualquier componente que le pases como parámetro. Pásale de parámetro el panel y llama al setVisible(false) de la ventana que te devuelva ese método.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #7 (permalink)  
Antiguo 27/01/2013, 10:27
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: Adaptar largo y ancho de un jframe al de un jpanel

Muchisimas gracias me funcionó de maravillas me quedó así el botón:

JFrame ventana = (JFrame) SwingUtilities.getWindowAncestor(this.btnvolver);
ventana.setVisible(false);

gracias a tí ahora puedo avanzar con el invento que estoy haciendo.
Nuevamente gracias
  #8 (permalink)  
Antiguo 29/01/2013, 18:52
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: Adaptar largo y ancho de un jframe al de un jpanel

tengo una pregunta pero del mismo tema:

Lo que me ayudaste fue para un panel de guardar y modificar datos.
Ahora me pasa lo sgte:

como puedo usar un evento activated o load pero desde un jpanel???
o es mejor usar un observer para actualizar desde el jpanel???

Espero sus respuestas.
  #9 (permalink)  
Antiguo 30/01/2013, 06:57
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: Adaptar largo y ancho de un jframe al de un jpanel

¿qué es un evento activated o load? ¿quién genera el evento? ¿qué quieres actualizar en el panel a partir de ese evento?

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #10 (permalink)  
Antiguo 31/01/2013, 10:04
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: Adaptar largo y ancho de un jframe al de un jpanel

gracias por responder, veras lo que quiero hacer cuando se cierre el jframe con el panel fabricado, que en la ventana de otro jpanel fabricado que tiene el listado de carreras en un jtable quiero que se actualice con el objeto agregado:

private void listarCarreras()
{
modelo=(DefaultTableModel)tablaCursos.getModel();
modelo.setRowCount(0);
for(Carreras objcarrera : GestoraCarreras.getInstance().devolverDatos())
{
Object[] row={objcarrera.getNumero(),objcarrera.getNombre() ,objcarrera.getDuracion()};
modelo.addRow(row);
}
this.tablaCursos.setModel(modelo);
}

solo que no se como actualizar ese listado desde el jpanel, como se podria hacer?????

espero sus respuestas.
  #11 (permalink)  
Antiguo 31/01/2013, 10:19
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: Adaptar largo y ancho de un jframe al de un jpanel

Echa un ojo a este enlace a ver si te ayuda http://chuwiki.chuidiang.org/index.p...e_dos_ventanas

Si no tienes botón (parece tu caso) y quieres que sea al cerrar la ventana, en vez de un ActionListener usa un WindowListener y el método windowClosing() (sería el equivalente al ActionListener y el método actionPerformed().

No sé si es tu caso, pero un JDialog modal puede ayudar. Un JFrame abre un JDialog modal para que el usuario introduzca un dato. Cuando el usuario cierra el JDialog modal, el JFrame recoge el dato. Si el JDialog es modal, esto es sencillo porque el código se bloquea hasta que el usuario cierre el JDialog. Te quedaría tan sencillo como esto (código en el JFrame)

dialogoModal.setVisible(true); // Aqui el codigo se queda bloqueado hasta que el usuario cierre el dialogo
dato = dialogoModal.getDatoIntroducido();

Así te ahorras los listener de cualquier tipo.... En el último apartado de este enlace http://chuwiki.chuidiang.org/index.p...1logos_modales se comenta algo de esto con dialogos modales.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #12 (permalink)  
Antiguo 02/02/2013, 19:27
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: Adaptar largo y ancho de un jframe al de un jpanel

Hola, nuevamente gracias por responder, intente hacer esto según x lo que me mostraste hice lo siguiente:

ackage institutomymaster.vistas.util;
import institutomymaster.dominio.GyF.GestoraCarreras;
import institutomymaster.dominio.clases.Carreras;
import institutomymaster.vistas.interfaz.frmAcciones;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
public class MantenimientoCarreras extends javax.swing.JPanel
{
private String accion;
private String tipo;
private DefaultTableModel modelo;
public MantenimientoCarreras(String xaccion,String xtipo)
{
initComponents();
accion=xaccion;
tipo=xtipo;
JFrame ventana = (JFrame) SwingUtilities.getWindowAncestor(this);
ventana.addWindowListener(new VentanaEscucha());

// this.listarCarreras();
}
private void listarCarreras()
{
modelo=(DefaultTableModel)tablaCursos.getModel();
modelo.setRowCount(0);
for(Carreras objcarrera : GestoraCarreras.getInstance().devolverDatos())
{
Object[] row={objcarrera.getNumero(),objcarrera.getNombre() ,objcarrera.getDuracion()};
modelo.addRow(row);
}
this.tablaCursos.setModel(modelo);
}

private void btnguardarActionPerformed(java.awt.event.ActionEve nt evt) {
frmAcciones frm= new frmAcciones("Guardar","Carrera",null);
frm.setVisible(true);
}

class VentanaEscucha implements WindowListener
{

@Override
public void windowOpened(WindowEvent e) {
throw new UnsupportedOperationException("Not supported yet.");
}

@Override
public void windowClosing(WindowEvent e) {
throw new UnsupportedOperationException("Not supported yet.");
}

@Override
public void windowClosed(WindowEvent e) {
throw new UnsupportedOperationException("Not supported yet.");
}

@Override
public void windowIconified(WindowEvent e) {
throw new UnsupportedOperationException("Not supported yet.");
}

@Override
public void windowDeiconified(WindowEvent e) {
throw new UnsupportedOperationException("Not supported yet.");
}

@Override
public void windowActivated(WindowEvent e) {
listarCarreras();
}

@Override
public void windowDeactivated(WindowEvent e) {
throw new UnsupportedOperationException("Not supported yet.");
}
}
}

pero no funciono me da nullpointerexception calculo que el error esta en:

JFrame ventana = (JFrame) SwingUtilities.getWindowAncestor(this);
ventana.addWindowListener(new VentanaEscucha());

pero no estoy seguro, espero sus respuestas.

POSDATA: Aclaro que esta idea es para que se actualice el listado en esa ventana con el panel fabricado al cerrar otra ventana con otro panel fabricado.
  #13 (permalink)  
Antiguo 02/02/2013, 23:48
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: Adaptar largo y ancho de un jframe al de un jpanel

Cuando haces esa llamada, no has metido el JPanel en ninguna ventana, así que el método getWindowAncestor te está devolviendo null. (ventana = null) y la llamada a null.addWindow() da NullPointerException. Tienes que hacer esas llamadas DESPUES de haber añadido el panel a alguna ventana.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #14 (permalink)  
Antiguo 03/02/2013, 18:10
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: Adaptar largo y ancho de un jframe al de un jpanel

ahora si me dejaste sin ideas porque la ventana a la fabrico dicho panel que puse tiene el siguiente código:

package institutomymaster.vistas.interfaz;
import java.awt.GridLayout;
import javax.swing.JPanel;
public class frmMantenimiento extends javax.swing.JFrame
{
private String accion;
private String tipo;
private JPanel objpanel;
public frmMantenimiento(String xaccion,String xtipo)
{
initComponents();
accion=xaccion;
tipo=xtipo;
objpanel= FachadaVentanas.getInstance().fabricarPanelMant(ac cion, tipo);
this.superPanel.removeAll();
this.superPanel.add(objpanel);
this.superPanel.setLayout(new GridLayout());
this.superPanel.updateUI();
this.setTitle(accion +" de "+tipo);

}

cómo podremos adaptarlo a los eventos del panel????
espero sus respuestas.
  #15 (permalink)  
Antiguo 04/02/2013, 01:57
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: Adaptar largo y ancho de un jframe al de un jpanel

Reorganiza el código de otra manera.

Tu FachadaVentanas.getInstance().fabricarPanelMant(ac cion, tipo); parece ser que es el que llama por debajo al getWindowAncestor, pero pones el panel dentro de la ventana (imagino, no se que es eso de this.superPanel) en his.superPanel.add(objpanel); dos líneas más abajo.

No puedes llamar a getWindowAncestor en la construcción de un panel, antes de de haberlo metido en ningún sitio. Se me ocurren algunas opciones

Pasa el JFrame como parametro a fabricarPanelMant(). Así lo tendrás disponible y no necesitarás llamar a getWindowAncestor().

Otra opción es añadir al panel en el constructor un addHierarchyListener(). De esta forma te saltará un evento cuando el panel se añada a alguna ventana y ahí podrás hacer la llamada a getWindowAncestor().

Y una tercera opción es añadir al panel un addComponentListener(). Esto te hará llegar un evento cuando el panel se oculte o visualice. Reemplazaría posiblemente a la llamada que estás haciendo a getWindowAncestor() par a llamar a addWindowListener(). En vez de enterarte cuando se cierra el JFrame, te enterarías cuándo se oculta el panel.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #16 (permalink)  
Antiguo 05/02/2013, 20:55
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: Adaptar largo y ancho de un jframe al de un jpanel

Gracias por responder, solucioné el problema usando la primera opción que me diste: Pasa el JFrame como parametro a fabricarPanelMant() y usé WindowAdapter en vez de WindowAdapter y funcionó de maravillas.
Muchas gracias, en serio me ayudaste mucho chuidiang.
Nuevamente gracias.

Última edición por detective_jd; 07/02/2013 a las 19:36

Etiquetas: ancho, jframe, jpanel, largo, string
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 21:37.