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

Añado varios JPanel (no uno sobre otro) a mi JFrame, pero solo se ve el primero

Estas en el tema de Añado varios JPanel (no uno sobre otro) a mi JFrame, pero solo se ve el primero en el foro de Java en Foros del Web. Tengo un problema que no estoy seguro si es de código o de falta de entendimiento. Estoy creando una clase que me debe crear un ...
  #1 (permalink)  
Antiguo 10/10/2015, 06:08
 
Fecha de Ingreso: agosto-2014
Mensajes: 30
Antigüedad: 10 años, 2 meses
Puntos: 0
Añado varios JPanel (no uno sobre otro) a mi JFrame, pero solo se ve el primero

Tengo un problema que no estoy seguro si es de código o de falta de entendimiento.

Estoy creando una clase que me debe crear un JFrame, al cual quiero dar un Layout del tipo BorderLayout. Luego, esta clase que me crea el JFrame debe crear dos instancias de una clase interna. Esta otra clase de la que hablo, hereda de JPanel, de modo que lo que está haciendo al crear dos instancias de ella es crear dos paneles, para luego añadirlos a mi JFrame (el primero en la zona Norte del JFrame y el segundo en la central). El problema es el siguiente... cuando el programa se inicia y salta el JFrame... el único panel del mismo que se ve es el primero que agregué, el de arriba. Para que aparezca el segundo necesito cambiar el tamaño de la ventana arrastrando con el ratón... si creo más paneles y los añado al JFrame, pasa exactamente lo mismo. A partir del primero, el resto solo se ven después de que haya cambiado el tamaño de la ventana. Tras buscar y buscar, entiendo que lo que está ocurriendo es que el método paintComponent solo se está ejecutando cuando añado el primer panel a mi JFrame... he intentado forzarlo (mediante repaint() ) tras añadir el otro panel... pero no funciona.

Codigo Java
Código Java:
Ver original
  1. import java.awt.*;
  2. import java.awt.color.*;
  3. import javax.swing.*;
  4.  
  5.  
  6. public class Interfaz extends Thread
  7. {  
  8.     private JFrame ventana;
  9.     private String[] textoBoton = {"Primero", "Anterior","Insertar","Buscar", "Modificar", "Siguiente", "Último"};
  10.     private String[] textoEtiqueta = {"Dni", "Nombre","Primer Apellido", "Segundo Apellido"};
  11.    
  12.     public Interfaz()
  13.     {
  14.         construirVentana();
  15.     }
  16.  
  17.     private void construirVentana()
  18.     {
  19.         /*Creo el JFrame dandole un titulo*/
  20.         ventana = new JFrame( "Fichas de Alumnos");
  21.         /*Agarro los datos del sistema*/
  22.         Toolkit datosSistema = Toolkit.getDefaultToolkit();
  23.         /*Agarro el tamaño de la pantalla*/
  24.         Dimension tamañoPantalla = datosSistema.getScreenSize();
  25.         /*tomo el ancho de la pantalla*/
  26.         int ancho = (int)tamañoPantalla.getWidth();
  27.         /*guardo en la variable anchoVentana la medida que representa el 40% del ancho de la pantalla*/
  28.         int anchoVentana = (ancho * 40)/100;
  29.         /*tomo el alto de la pantalla*/
  30.         int alto = (int)tamañoPantalla.getHeight();
  31.         /*guardo en la variable altoVentana la medida que representa el 40% del alto de la pantalla*/
  32.         int altoVentana = (alto * 40)/100;
  33.         /*Le digo a mi JFrame que su ancho y alto serán iguales al 40% de la pantalla*/
  34.         ventana.setSize(anchoVentana, altoVentana);
  35.         /*Coloco el JFrame en el centro de la pantalla*/
  36.         ventana.setLocation((ancho/2)-(anchoVentana/2),(alto/2)-(altoVentana/2));
  37.         /*Le digo al programa que cuando el JFrame se cierre también se cierre él*/
  38.         ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  39.         /*Creo un objeto BorderLayout*/
  40.         BorderLayout bl = new BorderLayout();
  41.         /*Le digo al JFrame que el suyo será un Layout tipo Border*/
  42.         ventana.setLayout(bl);
  43.         /*Introduzco el panel de contenido el JFrame en un Container*/
  44.         Container panelContenedor = ventana.getContentPane();
  45.         /*Hago visible al JFrame*/
  46.         ventana.setVisible(true);
  47.         /*Creo un FlowLayout*/
  48.         FlowLayout fl = new FlowLayout(FlowLayout.CENTER,20,20);
  49.         /*Creo un JPanel cuyo Layout será del tipo Flow;*/
  50.         ConstruirPaneles cp = new ConstruirPaneles(fl, textoBoton, true, textoEtiqueta, false, false);
  51.         /*Agrego el nuevo panel a mi Contenedor en su zona norte*/
  52.         /*Doy un color al BackGround de mi panel*/
  53.         cp.setBackground(Color.BLUE);
  54.         panelContenedor.add(cp, BorderLayout.NORTH);
  55.         /*Creo un nuevo Layout*/
  56.         GridLayout gl = new GridLayout(4,2);
  57.         /*Creo un nuevo panel con el nuevo Layout*/
  58.         ConstruirPaneles cp2 = new ConstruirPaneles(gl, textoBoton, false, textoEtiqueta, true, true);
  59.         /*Agrego el panel a mi Contenedor.*/
  60.         panelContenedor.add(cp2,BorderLayout.CENTER);
  61.     }
  62.    
  63.    
  64.    
  65.         @SuppressWarnings("serial")
  66.         private class ConstruirPaneles extends JPanel
  67.         {
  68.             private String[] textoBotones;
  69.             private String[] textoEtiquetas;
  70.             private boolean textField, etiquetas, botones;
  71.             private LayoutManager layoutPanel;
  72.            
  73.             public ConstruirPaneles(LayoutManager layoutPanel, String[] textoBotones, boolean botones, String[] textoEtiquetas, boolean etiquetas, boolean textField)
  74.             {
  75.                    this.layoutPanel = layoutPanel;
  76.                    this.textoBotones = textoBotones;
  77.                    this.textoEtiquetas = textoEtiquetas;
  78.                    this.textField = textField;
  79.                    giveLayout();
  80.                    if(botones)
  81.                    {
  82.                        crearBotones();
  83.                        
  84.                    }
  85.                    
  86.                    if(etiquetas)
  87.                    {
  88.                        crearEtiquetas();
  89.                      
  90.                    }
  91.                    
  92.                    
  93.             }
  94.            
  95.            
  96.             public void paintComponent(Graphics g)
  97.             {
  98.                 super.paintComponent(g);
  99.                
  100.             }
  101.            
  102.            
  103.             public void giveLayout()
  104.             {
  105.                 this.setLayout(layoutPanel);
  106.             }
  107.            
  108.             public void anadirLabel(JLabel etiqueta)
  109.             {
  110.                 add(etiqueta);
  111.                 if(textField)
  112.                 {
  113.                     crearCampoDeTexto();
  114.                 }
  115.             }
  116.            
  117.             public void anadirButton(JButton boton)
  118.             {
  119.                 add(boton);
  120.             }
  121.            
  122.             public void crearEtiquetas()
  123.             {
  124.                 for(int i = 0; i<textoEtiquetas.length; i++)
  125.                 {
  126.                     JLabel lb = new JLabel(textoEtiquetas[i]);
  127.                     anadirLabel(lb);
  128.                 }
  129.             }
  130.            
  131.             public void crearBotones()
  132.             {
  133.                 for(int i = 0; i<textoBotones.length; i++)
  134.                 {
  135.                     JButton btn = new JButton(textoBotones[i]);
  136.                     anadirButton(btn);
  137.                 }
  138.                
  139.             }
  140.            
  141.             public void anadirTextField(JTextField campoTexto)
  142.             {
  143.                 add(campoTexto);
  144.             }
  145.            
  146.             public void crearCampoDeTexto()
  147.             {
  148.                 JTextField tf = new JTextField();
  149.                 anadirTextField(tf);
  150.             }
  151.            
  152.         }
  153.    
  154. }
  #2 (permalink)  
Antiguo 10/10/2015, 07:10
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 3 meses
Puntos: 182
Respuesta: Añado varios JPanel (no uno sobre otro) a mi JFrame, pero solo se ve el pr

Buenas,

Yo no entiendo por que la clase extiende de Thread. Tampoco veo donde llamas a construirVentana.


Un saludo
__________________
If to err is human, then programmers are the most human of us
  #3 (permalink)  
Antiguo 10/10/2015, 07:23
 
Fecha de Ingreso: agosto-2014
Mensajes: 30
Antigüedad: 10 años, 2 meses
Puntos: 0
Respuesta: Añado varios JPanel (no uno sobre otro) a mi JFrame, pero solo se ve el pr

Nada tiene que ver Thread con el problema que anteriormente he expuesto. ConstruirVentana() se usa desde el constructor de la clase Intefaz. A ver si alguno que sepa del tema puede ayudarme.
  #4 (permalink)  
Antiguo 10/10/2015, 07:24
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 3 meses
Puntos: 182
Respuesta: Añado varios JPanel (no uno sobre otro) a mi JFrame, pero solo se ve el pr

Cita:
A ver si alguno que sepa del tema puede ayudarme.
Insinuas que 'no se del tema' despues de postear ese codigo y no saber ni pintar una ventana?

Sabes siquiera lo que es el EDT?

Lo que hay que leer...
__________________
If to err is human, then programmers are the most human of us
  #5 (permalink)  
Antiguo 10/10/2015, 07:30
 
Fecha de Ingreso: agosto-2014
Mensajes: 30
Antigüedad: 10 años, 2 meses
Puntos: 0
Respuesta: Añado varios JPanel (no uno sobre otro) a mi JFrame, pero solo se ve el pr

No tengo ni idea sobre lo que sabes o no sabes... ni tengo tiempo para insinuaciones. Mi frase, claramente, significaba : a ver si alguien que se haya encontrado con este problema y sepa resolverlo me puede ayudar. He venido aquí en busca de ayuda, no para discutir con desconocidos quienes leen entre líneas cosas que no existen. Deja el hilo para quien quiera ayudarme y no comentes más, por favor.
  #6 (permalink)  
Antiguo 10/10/2015, 07:58
 
Fecha de Ingreso: agosto-2014
Mensajes: 30
Antigüedad: 10 años, 2 meses
Puntos: 0
Respuesta: Añado varios JPanel (no uno sobre otro) a mi JFrame, pero solo se ve el pr

Solucionado.

Por si alguien se encuentra con el mismo problema, la respuesta es el método pack(). El cual se usa en el JFrame.
  #7 (permalink)  
Antiguo 10/10/2015, 08:41
(Desactivado)
 
Fecha de Ingreso: marzo-2012
Mensajes: 366
Antigüedad: 12 años, 7 meses
Puntos: 31
Respuesta: Añado varios JPanel (no uno sobre otro) a mi JFrame, pero solo se ve el pr

Recientemente he aprendido que es más fácil poner un panel contenedor de panels, y luego tan solo poner la visibilidad de los internos a true o false.

Última edición por Kritik; 10/10/2015 a las 09:03

Etiquetas: clase, jframe, jpanel, primero, programa, 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 12:56.