2016-06-06 1 views
2

이렇게 말도 안되는 소리가 들리 겠지만 의도적으로 이미지로드를 느리게하여 한 행씩로드하려고하는 프로젝트를 진행하고 있습니다. 어쨌든 내가 할 수 있니? 내가 표시하기 위해 노력하고있어 이미지를 한 줄씩 불러 오기 Java

public ImagePane() { 
     initComponents(); 
     image = null; 
     //this.setAutoscrolls(true); 
    } 
    public void setImage(String path) throws IOException { 
     image = ImageIO.read(getClass().getResource(path)); 
    } 

    @Override 
    public void paintComponent(Graphics g) 
    { 
     //Graphics2D g2 = (Grahpics2D)g; 
     g.drawImage(image, 0,0, this); 
    } 

그리고 내 창에

이 같이 :

ImagePane image = new ImagePane(); 
try { 
    image.setImage("netscapelogo2.png"); 
} 
catch (IOException e) { 
    System.out.print("Failed to Set"); 
    e.printStackTrace(); 
} 
//jScrollPane1.add(image); 
jScrollPane1.setViewportView(image); 

내가 필요하다고 생각 나는 현재 JPanel의 단지 확장 인 ImagePane의 이미지를 가지고 누군가가 내 paintComponent 메소드를 변경하여이 작업을 수행하지만 정확히 수행하는 방법을 모르겠습니다.

+3

느린 로딩 이미지 경험을 원한다면, 원시 픽셀 데이터를 얻어서 행마다 그려야 할 것입니다. 'Image/BufferedImage' ('getRGB()/getRaster()'등)에 대해서는 javadocs를 참조하십시오. – Kayaman

+1

나는 이미지가 점차적으로 밝혀 짐으로써 줄 단위로로드되고 있음을 시뮬레이션 할 것이다. – rodrigoap

답변

2

이 솔루션은 프리미엄 I would simulate that the image is loading line by line by uncovering it gradually. – rodrigoap을 사용하므로 한 번에 이미지가로드되고 으로 표시되므로 줄 단위로 읽을 수 있습니다!

솔루션을 사용하여 이미지를 그릴 때 그냥 모든 전체 이미지 라인의 양이 아니라 그릴

Runnable r = new Runnable(){ 

    @Override 
    run(){ 
     for(int i = 0; i < image.getHeight(); i++){ 
      // wait 100ms to 'slow down' 
      Thread.sleep(100)// surround with try/catch, it may throw an exception 
      line = line + 1; //increase amount of visible lines 
      repaint(); //update the panel 
     } 
    } 
} 

//i don't know when you want to start the animation 
new Thead(r).start(); //so trigger at free will 

... 작업에 스레드를 스레드를 만들 수 있도록하는 것입니다. ..

은의 drawImage 메도 조금 이상한
@Override 
public void paintComponent(Graphics g) 
{ 
    super(g); 
    int w = image.getWidth(); 
    int h = image.getHeight(); 
    g.drawImage(image, 0,0, w, line, 0,0,w,h,this); 
} 

, 당신은 private int line = 0;를 정의 할 필요가 더 도움을 물론

docu 참조 어떤 곳에서

+1

흠 - 당신도 스윙 타이머 또는 뭔가를 사용할 수 있다고 생각합니다 ... 나는 그것에 대해 잊어 버렸지 만,이 솔루션은 문제를 해결하는 방법을 쉽게 조정할 수 있습니다 다른 시간 처리기 –

+1

타이머가 많이 될 것입니다 ** 더 나은 솔루션 - 그다지 * 정확한 타이밍을 시뮬레이트하지 마십시오. 그럴싸한 오류가 발생하기 쉽고 초보자의 실수입니다. 가독성을 높이기 위해'ExecutorServices'와'Lambda'를 사용하십시오. 또한'int' 대신'static final AtomicInteger'를 사용하십시오. 그렇지 않으면 당신은 ** 경주 조건으로 돌입 할 것입니다. 아마 단단한 교착 상태 일 것입니다. – specializt

+1

@specializt 알아요. 알아요. 답을 수정하십시오. 나는별로 똑똑하지 않습니다. 그 주제에! 나는 그들이 존재하고 더 나은 해결책을 알고 있지만 한번도 사용해 본 적이 없습니다! 부끄러운 줄 알아! –