2017-09-14 3 views
0

JScrollPane이있는 JPanel을 가지고 있는데, JScrollPane을 사용할 때 JPanels 다시 그리기 메서드가 호출됩니다. 내 JPanel 자체가 적시에 다시 그리기 때문에이 기능을 해제하고 싶습니다.다시 그리기에서 JScrollPane 중지

페인트 메소드를 호출하기 위해 getClipBounds()를 업데이트 했으므로 페인트 메소드를 호출하는 것이 좋습니다.

+0

이 도움이 될 수도, 메신저 확실하지, https://stackoverflow.com/questions/1249278/how-to-disable-the-default-painting-behaviour-of-wheel-scroll-event-on-jscrollpa – Blasanka

+0

그걸 발견했는데, 그 방법은 도움이 되었기 때문에 그것을 해제하지 마십시오. – TheSorm

+0

API가 작동하는 방식이 아님 - 패널이 변경되면 패널의 내용을 'BufferedImage'로 페인트하고'paintComponent' get이 호출 될 때 간단히 페인트합니다 – MadProgrammer

답변

0

그럴 수 없습니다 - 스크롤 바의 위치에 따라 뷰포트에 포함 된 JPanel의 다른 부분이 표시되기 때문에 다시 칠해야하는 영역이 실제로 새로 표시되고 이전에 페인트되지 않았을 수 있습니다 . JScrollPane 이후

가 포함 된 Component이 구현되는 방법을 알고하지 않으며, 그것의 전체 영역 또는 다시 칠 필요가 영역 만 다시 그립니다 여부는 스크롤에 따라 자체를 다시 그리기 포함 된 Component을 강제로.

그러나 대신 표시 할 내용을 비트 맵에 렌더링 한 다음 paintComponent(Graphics) 메서드에서 비트 맵을 그릴 수 있습니다. 따라서 페인트 한 내용을 효과적으로 버퍼링하고 필요할 때마다 버퍼링 된 비트 맵에 대한 업데이트를 시작할 수 있습니다. 위해

비트 맵에 페인트, 당신은이 작업을 수행 할 수 있습니다

BufferedImage buffer; // this is an instance variable 

private void updateBuffer(){ 
    // Assuming this happens in a subclass of JPanel, where you can access 
    // getWidth() and getHeight() 
    buffer=new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB); 
    Graphics g=buffer.getGraphics(); 
    // Draw into the graphic context g... 
    g.dispose(); 
} 

그런 다음 인 JPanel에, 당신은의 paintComponent 메소드를 오버라이드 (override) :

public void paintComponent(Graphics g){ 
    g.drawImage(buffer, 0, 0, this); 
} 
+0

'drawImage'의'ImageObserver' 매개 변수로'this'를 전달해야합니다 - 순전히 컨벤션으로 – MadProgrammer

+0

네, 좋은 지적입니다 - 고마워요. 그에 따라 답변을 수정하겠습니다. –