2011-09-14 27 views
5

Tengo una clase simple que pinta un gráfico en un JPanel. Esta es mi clase:¿Quién está llamando al método paintComponent() en mi clase?

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import javax.swing.JPanel; 

class Drawing_panel extends JPanel { 
    public void paintComponent(Graphics g) { 
    super.paintComponent(g);  
    this.setBackground(Color.white); 
    g.setColor(Color.red); 
    g.fillRect(150, 80, 20, 20); 
} 

public Dimension getPreferredSize(){ 
    return new Dimension(500,500); 
} 

}

He otra clase que crea una instancia éste:

Drawing_panel dp = new Drawing_panel(); 

No hay ningún constructor en la clase Drawing_panel y/o ninguna llamada explícita a cualquiera de los paintComponent() o getPreferredSize() métodos. Supongo que se llama al método en el constructor padre JPanel, pero tampoco vi las llamadas allí.

+0

por favor aprenda las convenciones de nomenclatura de java y cúmplalas – kleopatra

Respuesta

6

Se llama al paintComponent desde algunos lugares diferentes. La llamada de JComponent.paint es probablemente la que está buscando.

Tenga en cuenta que paintComponent es no llamado desde cualquier constructor. El paintComponent se llama "bajo demanda" es decir, cuando el sistema decide que el componente necesita volver a dibujarse. (Podría ser, por ejemplo, cuando el componente cambia de tamaño, o cuando la ventana se restaura desde un estado minimizado.) Para ser claro: El componente no está "pintado, luego usado", es "usado, luego pintado cuando es necesario".

Toda esta cadena de llamadas a la pintura no es nada de lo que deba preocuparse, ya que está totalmente resuelta por Swing y el llamado Event Dispatch Thread.

3

Cuando subclase JComponent o JPanel para dibujar gráficos, anule el método paintComponent(). Se llama a este método porque el usuario hizo algo con la interfaz de usuario que requirió redibujado, o su código ha solicitado explícitamente que se vuelva a dibujar. Llamado automáticamente cuando se vuelve visible Cuando una ventana se vuelve visible (descubierta o desminimizada) o cambia de tamaño, el "sistema" llama automáticamente al método paintComponent() para todas las áreas de la pantalla que deben volver a dibujarse.

+0

@Jonas - Gracias por las respuestas perspicaces, especialmente con respecto al uso del método repaint(). Eso será util. – jamesTheProgrammer

Cuestiones relacionadas