Estoy escribiendo un programa en el que tengo un JFrame y quiero quitar todos los componentes y, a continuación, añadir un solo componente y volver a pintar el cuadro. Lo que tengo hasta ahora es algo así como el código de abajo (llamado en un objeto que implementa JFrame, donde StartPanel implementa JPanel):

removeAll();    
startPanel = new StartPanel();
startPanel.setVisible(true);
add(startPanel);
revalidate();
repaint();

Sin embargo, cuando ejecuto el código se muestra una ventana vacía (no la startPanel) y cuando me minimizar/cambiar el tamaño de la ventana, la ventana se vuelve de color negro. Si dejo a un lado el removeAll() y no hay elementos que ya están en el JFrame se muestra el startPanel bien. Cualquier idea sobre cómo realmente quita todo, y a continuación, obtener el nuevo panel que todavía se presentan?

  • Una palabra: CardLayout
  • que podría funcionar, pero es hay alguna otra manera de hacerlo manualmente? y ¿por qué no removeAll() trabajando como creo que debería? ¿y si en otras partes del código que necesito tener algunas combinaciones de los diferentes componentes (no sólo una muestra de una vez), así que no quiero un CardLayout?
InformationsquelleAutor scaevity | 2012-02-19

3 Comentarios

  1. 50

    Debe llamar

     private JFrame frame = new JFrame();
     ...
     ...
     frame.getContentPane().removeAll();
     frame.repaint();

    removeAll() no ha sido priorizada como add() o remove() a remitir a la contentPane como sea necesario.

    • muchas gracias, esto parece que funciona!
    • Kavka parece tener la nitidez de los ojos que el resto de nosotros. Buena captura y 1+.
    • Gracias por su concisa y útil respuesta. removeAll() realmente debería haber sido reemplazado como add() y remove() de la manera que usted describe. Otro de Java extraño, peculiaridades…
    • Una llamada a revalidate() también puede ser necesario, como se muestra en la pregunta original, pero no en esta respuesta. Llamar revalidate() es necesario si posteriormente añadir algo más a la JFrame. Sé que este no es el original de la pregunta, pero creo que es bastante común utilizar el asunto de la nota aquí. Como era mi caso de uso y me encontré con esta pregunta/respuesta en mi búsqueda de Google.
  2. 4

    asumiendo que su objetivo es añadir algo más después de
    claro que el marco debe llamar a validar después de
    la adición de los componentes a actualizar

    getContentPane().removeAll();
    add(new component);
    validate();

Dejar respuesta

Please enter your comment!
Please enter your name here