2012-09-01 2 views
7

먼저 모자이크 이미지 생성기를 작성하는 과제물의 일부입니다. 프로그램이 이미지를 찾아서 다른 이미지 (소스 이미지)의 위에 놓을 때 실시간으로 다시 그리기를 원합니다.Java가 컴포넌트의 오버로드 된 paintComponent 메소드를 호출하지 않음

내 주요 기능에 패널을 만드는 코드입니다.

마지막 부분 인 mypanel.create()는 모자이크 논리입니다.

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

모자이크 패널 클래스 코드 내가 paintTile 기능 내에서 모자이크 기능을 만들 전화

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

스 니펫.

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

그건 내 프로그램 논리입니다. 두 번째 스 니펫에서이 주석을 제거하면 // this.paintComponent (this.getGraphics()); 프로그램이 작동하지만 끔찍한 플래시로 다시 칠해지며 데모 장소 내 다른 학생들 중 일부가 간질 발작을하는 경우 의료비 청구서가 아닙니다.

traceComponent 함수를 추적하면 프로그램의 끝에 두 번 호출되며 모든 다시 그리기에는 호출되지 않습니다.

미리 감사드립니다.

여러분이 복사하여 실행할 수있는 소스 코드를 추가했습니다. 기본으로 테스트하고자하는 이미지를 선택 것은 너희들이 없기 때문에 현재 사용할 수 없습니다 그것은

다음 순간 아직도 꽤 느린 와 타일을에 JPG 잔뜩 들어있는 디렉토리 수정이 필요함 Google docs link to the java file

+5

[sscce] (http://sscce.org) – mre

+6

직접 도움을 받으려면'paintComponent (...) '를 직접 호출해서는 안되며'getGraphics()'를 사용해야합니다. Graphics 객체를 가져 오기위한 구성 요소. 대신 JVM의 Graphics 객체를 사용하십시오 (BufferedImage의 Graphics 객체로 작업하지 않는 한). Swing 그래픽 튜토리얼은이 모든 것을 설명합니다. –

+0

이 parent.paintTile (this) 컴파일 방법에 대해 궁금한가요? –

답변

1

다른 스레드에서 다시 그리기를 시도하십시오. 어쩌면 이것이 당신의 문제를 해결할 것입니다. 행운을 비네! :)

+0

당신은 그것을 시도합니까 ??? 작동합니까??? :) – Hydroid