2012-02-07 24 views
5

Aquí es una pieza de código ejecutable de explicar el problema -componente dinámica de la eliminación de JPanel

puedo quitar S1 y S2, pero no s3.
Esto no parece estar relacionado con MigLayout (lo estoy usando) ya que también veo el mismo comportamiento con el diseño predeterminado.


import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 

import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

import net.miginfocom.swing.MigLayout; 

public class MyFrame2 extends JFrame { 
    private JPanel main; 
    private JPanel s1; 
    private JPanel s2; 
    private JPanel s3; 

    public static void main(String[] args) throws InterruptedException { 
     MyFrame2 f = new MyFrame2(); 
     f.setVisible(true); 
     Thread.sleep(2000); //you can see all three panels for two seconds 

     f.main.remove(f.s1); 
     f.main.validate(); 
     Thread.sleep(2000); 
     f.main.remove(f.s2); 
     f.main.validate(); 
     Thread.sleep(2000); 
     f.main.remove(f.s3); 
     f.main.validate(); 
    } 

    public MyFrame2() { 
     main = new JPanel(); 

     main.setLayout(new MigLayout()); 

     main.add(new JLabel("Why does s3 not disappear?"),"w 200, h 100, wrap"); 

     s1 = new JPanel(); 
     s1.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.GRAY,1),"s1")); 
     main.add(s1,"w 90%, h 300, wrap"); 

     s2 = new JPanel(); 
     s2.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.GRAY,1),"s2")); 
     main.add(s2,"w 90%, h 300, wrap"); 

     s3 = new JPanel(); 
     s3.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.GRAY,1),"s3")); 
     main.add(s3,"w 90%, h 300, wrap"); 

     getContentPane().setLayout(new BorderLayout()); 
     getContentPane().add(main, BorderLayout.CENTER); 

     setSize(new Dimension(800, 600)); 

    } 
} 

Respuesta

11

llamada al final, después de la última f.validate():

f.repaint(50L); 

Como la última validación no cambia maquetación.

+0

Gracias. ¡Funciona! (+1) ¿puedes por favor elaborar un poco? ¿Por qué la última validación no cambia el diseño mientras que todas las validaciones anteriores lo hacen? (Claramente, no hago mucho desarrollo de balanceo) –

+2

La última validación * no * cambia el diseño; simplemente no lo ves. El último componente se ha eliminado de hecho después de la llamada para validar, pero debe volver a pintar el componente para ver la prueba visual de esta eliminación. –

+0

@HovercraftFullOfEels: gracias. –

5

En primer lugar, objetos GUI columpios deben estar construidos y manipulados solamente en el event dispatch thread, pero no deben dormir en el EDT. En su lugar, use javax.swing.Timer para marcar el tiempo, como se muestra en here.

+0

gracias. Esto fue solo un truco rápido para demo el problema –

+1

@amol: Los componentes hermanos se vieron afectados, redimensionados y tuvieron que volverse a dibujar en la validación. El último componente no desencadenó tal redibujado. (disculpa el lugar equivocado de este comentario) –

Cuestiones relacionadas