Java Swing validar() vs repaint()

Estoy armando un Swing de aplicación donde a menudo me desea reemplazar el contenido de un JPanel. Para ello, voy a llamar a removeAll(), a continuación, agregar a mi contenido nuevo, a continuación, llamar a revalidate().

Sin embargo, me estoy encontrando que el contenido antiguo es todavía realmente visible (aunque oscurecida por el nuevo contenido). Si puedo añadir una llamada a repaint() además revalidate(), que funciona como se espera.

Estoy seguro de que en otras ocasiones he tenido la experiencia de que, con sólo llamar a revalidate() es suficiente.

Así que básicamente mi pregunta es debo necesidad de llamar a las funciones y si no, ¿cuándo debo llamar a cada uno de ellos?

  • Este tutorial de Oracle estados: «Siempre invocar a repintar después de revalidar». Ninguna explicación es siempre aunque.
InformationsquelleAutor William | 2009-07-08

5 Kommentare

  1. 154

    Usted necesita llamar a repaint() y revalidate(). El ex dice Swing que un área de la ventana es sucio (que es necesario para borrar la imagen de la edad de los niños retirados por removeAll()); la segunda, dice el administrador de diseño para recalcular el diseño (que es necesario que la adición de componentes). Esto debe provocar niños del panel de volver a pintar, pero no puede hacer que el panel de sí mismo para hacerlo (ver este para la lista de repintar desencadenantes).

    De un modo más general nota: en lugar de reutilizar el panel original, me gustaría recomendar la construcción de un nuevo panel y el intercambio de ellos en el padre.

    • Podría racionalizar por qué la construcción de un nuevo panel es una solución mejor que el uso de la vieja? 🙂
    • es menos trabajo, y por lo tanto menos propenso a errores.
  2. 84

    Cualquier momento de hacer una remove() o un removeAll(), usted debe llamar a

      validate();
      repaint();

    después de haber terminado de agregar()’ción de los nuevos componentes.

    Llamar a validar() o validar() es obligatoria cuando usted hace una remove() – ver javadocs.

    Mis propias pruebas indica que repaint() también es necesario. No estoy seguro exactamente por qué.

  3. 58

    revalidate se llama en un contenedor una vez que se añaden componentes nuevos o viejos eliminado. esta llamada es una instrucción para decirle al administrador de diseño para restablecer basado en la nueva lista de componentes. revalidate activará una llamada para volver a pintar lo que el componente se piensa que son » sucios regiones.’ Obviamente no todas las regiones en su JPanel son considerados sucios por el RepaintManager.

    repaint se utiliza para indicar un componente que vuelva a dibujar. Es a menudo el caso de que usted necesita llamar a este en orden para la limpieza de condiciones tales como la suya.

  4. 4

    revalidate() acaba de solicitar en el diseño del contenedor, cuando experimentó simplemente llame revalidate() funciona, podría ser causada por la actualización de los componentes hijos límites desencadena la repaint() cuando sus límites son modificados durante el re-diseño. En el caso que usted menciona, solo componente eliminado y ningún componente de los límites han cambiado, en este caso no repaint() es «accidentalmente» activa.

  5. -4

    sí, usted necesita llamar
    repaint();
    validar();
    cuando llame removeAll (), entonces usted tiene que llamar a repaint() y volver a validar()

    • Y esto difiere de lo aceptado responder a cómo?

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea