2012-09-01 14 views
7

Primero, esto es parte de una tarea para crear un generador de imágenes de mosaico. Quiero que el programa vuelva a pintar en tiempo real, ya que encuentra una imagen y la coloca encima de otra (imagen de origen).Java no llama al método paintComponent sobrecargado del componente

Este es el código para crear el panel en mi función principal.

La última pieza mypanel.create() es la lógica de mosaico.

myPanel = new mosiacPanel(sourceFile, sizePercent, pixesize,threads, imageList); 
//test.setText(Integer.toString(myPanel.getWidth())); 
JFrame frame2 = new JFrame("COS 226 MOSIAC OF AWESOMENESS BY SLUIPMOORD && ELEANORASAURUSS"); 
myPanel.setVisible(true); 
myPanel.repaint(); 
frame2.add(myPanel); 
if(myPanel.getWidth() > menubar.getWidth()){ 
    frame2.setSize(myPanel.getWidth() , myPanel.getHeight() + menubar.getHeight()); 
    frame2.repaint(); 
} else { 
    frame2.setSize(menubar.getWidth() , myPanel.getHeight() + menubar.getHeight()); 
} 
frame2.setVisible(true); 
// myPanel.setLocation(170, 4); 
myPanel.create(); 

mosaico código de clase del panel de fragmento de código

public void create() 
{ 
    ph.createMosiac(imgUrls, this); 
} 

@Override 
protected void paintComponent(Graphics g) 
{ super.paintComponent(g); 
    g.drawImage(imgToPaint, 0, 0, null); 
    // System.out.println("paint"); 
} 

public void paintTile(BufferedImage img) 
{ 

    imgToPaint = img;   
    this.repaint(); 
    // this.paintComponent(this.getGraphics()); 
} 

que llamo la función paintTile en función Crear mosaico.

public void createMosiac(List<String> fileNames, mosiacPanel parent) 
{ 
    ArrayList<TileImage> srcTiles = new ArrayList<TileImage>(); 

    for(int i = 0; i < fileNames.size(); i++) 
    { 
     srcTiles.add(new TileImage(fileNames.get(i), tileSize)); 
    } 

    for(int y = 0; y <= (this.getHeight() - tileSize); y += tileSize) 
    {   
     for(int x = 0; x <= (this.getWidth() - tileSize); x += tileSize) 
     { 
      int location = 0; 
      double dist, high = 2147483647; 
      for(int i = 0; i < srcTiles.size(); i++) 
      { 
       dist = this.getTileImage(x, y).differance(srcTiles.get(i)); 

       if((dist < high)) 
       { 
        high = dist; 
        location = i; 
       }      
      } 

      this.setTileImage(x, y, srcTiles.get(location)); 
      parent.paintTile(this);     
     }    
    }       
} 

Esa es mi lógica de programa. Cuando descomiento esto en el segundo fragmento // this.paintComponent (this.getGraphics()); El programa funciona pero se repinta con un destello horrible y no soy uno para las facturas médicas cuando algunos de mis otros estudiantes en el lugar de demostración son propensos a ataques epilépticos.

Si trazo trazar la función paintComponent que ser llamado dos veces al final del programa y no en cada repintado.

Gracias de antemano.

he añadido un código fuente que ustedes simplemente copiar y correr. Seleccionar una imagen que desea probar con el valor por defecto no está disponible actualmente debido a que ustedes no lo tiene

y luego un directorio que contiene un montón de jpg a baldosas con Es bastante lento en el momento en que todavía necesita reparar que Google docs link to the java file

+5

Para una mejor ayuda antes, por favor incluye un [sscce] (http://sscce.org) – mre

+6

No deberías estar llamando 'paintComponent (...)' directamente ni deberías estar usando 'getGraphics()' en un componente para obtener el objeto Graphics. En su lugar, use el objeto Graphics desde la JVM (a menos que esté trabajando con un objeto Graphics de BufferedImage). Los tutoriales de gráficos Swing explican todo esto. –

+0

¿Se pregunta cómo se compila este 'parent.paintTile (this)'? –

Respuesta

1

intente repintado en otro hilo. Quizás esto resolverá tu problema. ¡Buena suerte! :)

+0

¿Lo intentas ??? ¿¿¿Funciona??? :) – Hydroid

Cuestiones relacionadas