Ver Mensaje Individual
  #1 (permalink)  
Antiguo 10/10/2015, 06:08
Lentorro
 
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. }