usar ejemplo codigo java swing resize refresh jcomponent

java - ejemplo - El contenido de mi JComponent solo se actualiza después de un cambio de tamaño manual



private jlabel (4)

Al cambiar el contenido del contenedor, debe llamar a ambos:

  • revalidate() para que vuelva a calcular el diseño de su contenido
  • repaint() para solicitar un repintado para este contenedor

Estoy intentando descubrir por qué mi JComponent se actualiza cuando arrastro manualmente mi ventana, pero no se actualiza cuando llamo a volver a pintar o revalidar. Los datos están listos para mostrarse, pero simplemente no se mostrarán hasta que cambie el tamaño manualmente. ¿Alguien puede dar algunas sugerencias sobre lo que puedo hacer o suena como si no fuera un problema de Swing porque intenté volver a pintar y revalidar?

Una de las cosas raras que he notado es que si tengo este código:

sp.setSize(sp.getSize().width, sp.getSize().height+1); sp.setSize(sp.getSize().width, sp.getSize().height-1);

Si se usa la primera línea, entonces JComponent se actualizará. Si uso ninguna o ambas de estas líneas, no lo hará, lo cual me parece extraño.

Básicamente estoy simplemente colocando un JPanel en un JInternalFrame en un JDesktopPane. Hay dos funciones principales para lo que estoy tratando de hacer. Uno agrega el nuevo JPanel y el otro intenta actualizarlo para que los nuevos datos muestren:

public void addNewSP() { sp = new JInternalFrame("SP"); sp.setClosable(true); sp.setLocation(700, 400); //this should be changed to something based on screen size sp.setResizable(true); sp.add(popUp); this.parentContainer.add(sp, JLayeredPane.DRAG_LAYER); sp.pack(); sp.show(); sp.setSize(500, 500); sp.setPreferredSize(new Dimension(500, 500)); } public void refreshSP() { sp.repaint(); sp.validate(); sp.repaint(); sp.validate(); parentContainer.validate(); parentContainer.repaint(); sp.setSize(sp.getSize().width, sp.getSize().height+1); sp.setSize(sp.getSize().width, sp.getSize().height-1); } }

BTW parentContainer es el JDesktopPane


si está modificando los subcomponentes del contenedor, debe llamar a jcomponent.validate ();


pero simplemente no se mostrará hasta que cambie el tamaño manualmente.

No conocemos el contexto de su pregunta, por lo que un SSCCE siempre debe publicarse como se sugirió anteriormente.

En general, un JComponent no tiene un tamaño preferido, así que supongo que Swing no cree que necesite pintar el componente. Cuando cambia el tamaño del marco, es probable que el componente se haya agregado al centro de un BorderLayout, por lo que se dimensiona automáticamente para ocupar todo el espacio del marco.

La solución es darle a su componente un "tamaño preferido" para que cualquier administrador de disposición pueda usar esta información para mostrar el componente correctamente.


¿Supongo que parentContainer es el JDesktopPane?
¿Qué tipo de cambios estás haciendo para sp que no se muestran?

Si cambia el tamaño de sp , Swing volverá a pintar desde cero. Es por eso que setSize() está arreglando la pantalla.

Lo más probable es que los cambios que está realizando no estén sucediendo en el EDT o no invaliden el contenedor correcto. Por ejemplo, si cambia la visibilidad de un componente en sp , deberá llamar a sp.invalidate() para volver a ejecutar el administrador de diseño.

¿Ha comprobado que solo está cambiando los componentes (o sus modelos) en el EDT?

Una prueba rápida para eso es ejecutar con la Substance LAF, ya que se quejará si cambia las cosas en otro hilo.