2012-09-01 8 views
7

Zuerst ist dies Teil einer Hausaufgabe, um einen Mosaikbildgenerator zu erstellen. Ich möchte das Programm in Echtzeit neu streichen, wie es ein Bild findet und es auf einem anderen (Quellbild) platzieren.Java ruft nicht die überladene Komponente der Komponente aufComponent-Methode

Dies ist Code, um das Panel in meiner Hauptfunktion zu erstellen.

Das letzte Stück mypanel.create() ist die Mosaik-Logik.

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(); 

Mosaik-Panel-Klasse Code-Schnipsel

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()); 
} 

Ich nenne die paintTile Funktion innerhalb Mosaik-Funktion erstellen.

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);     
     }    
    }       
} 

Das ist meine Programmlogik. Wenn ich das im zweiten Ausschnitt auskommentiere // this.paintComponent (this.getGraphics()); Das Programm funktioniert, aber es mit einem schrecklichen Flash neu lackiert und ich bin nicht eins für Arztrechnungen, wenn einige meiner anderen Studenten in der Demo-Veranstaltungsort anfällig für epileptische Anfälle sind.

Wenn ich Trace die PaintComponent Funktion verfolgt, wird es am Ende des Programms zweimal aufgerufen und nicht bei jedem Repaint.

Vielen Dank im Voraus.

Ich habe einen Quellcode hinzugefügt, den Sie einfach kopieren und ausführen können. ein Bild Wählen Sie mit dem Standard testen wollen, ist zur Zeit nicht verfügbar, weil ihr Jungs hat es nicht

und dann ein Verzeichnis ein Bündel von jpg Fliese mit enthält, ist es ziemlich langsam im Moment mich noch muss das beheben Google docs link to the java file

+5

Für bessere Hilfe früher, bitte fügen Sie eine [sscce] (http://sscce.org) – mre

+6

Sie sollten 'paintComponent (...)' nicht direkt aufrufen, noch sollten Sie 'getGraphics()' verwenden auf einer Komponente, um das Graphics-Objekt zu erhalten. Verwenden Sie stattdessen das Graphics-Objekt von der JVM (es sei denn, Sie arbeiten mit dem Grafikobjekt von BufferedImage). Die Swing-Grafik-Tutorials erklären dies alles. –

+0

Frage mich, wie diese 'parent.paintTile (this) 'kompilieren? –

Antwort

1

versuchen Sie die Neulackierung in einem anderen Thread. Vielleicht wird das dein Problem lösen. Viel Glück! :)

+0

Probieren Sie es ??? Funktioniert es??? :) – Hydroid