2009-02-19 2 views
5

스크롤 창 내부에 커다란 그래프를 그리는 루틴이 있습니다. scrollpane에 추가하기 전에 페인트하기에는 너무 큽니다. 목적인 요구 사항은 여러 가지 일 것입니다.내 jscrollpane이 Java 스윙에서 이상한 페인트 호출을하는 이유는 무엇입니까?

그래프의 크기 때문에 스크롤 패널의 자식의 페인트 메서드 내에서 차트를 렌더링하고 있습니다. 잘 작동하지만 스크롤 막대를 움직일 때마다 페인트 루틴이 두 번 호출된다는 사실을 알게되었습니다. 한 번은 펼쳐진 영역과 동일한 클리핑 영역을 사용하고 두 번째는 클립 영역을 뷰포트의 크기와 같게합니다. . 내가이 깜박 거림의 원인이되는 페인트 루틴 내에서 렌더링하기 때문에 ...

java.awt.Rectangle[x=0,y=195,width=245,height=3] 
java.awt.Rectangle[x=0,y=3,width=245,height=195] 

: 예를 들어

내 뷰포트는 다음과 같이 내 페인트 루틴이 g.getClipBounds() 세트로 불려갑니다 내가 3 개 픽셀 아래로 스크롤 245x195 & 경우 (내가 할 수있는 한 빨리 계산을 수행하지만 추측 할 수없는 지연이 있습니다.) 질문 :

  1. 누구나 2 차 페인트 호출을 방지하는 방법을 알고 있습니까? 이것은 평범한 jane JScrollPane입니다. 컴포넌트를 가지고 스크롤 패널에 추가하고, 스크롤 컴포넌트를 부모 컴포넌트에 추가합니다. 첫 번째 이미지 스크롤 데모 @the swing tutorial에서도이 동작을 볼 수 있습니다.

  2. # 1에 대한 답변이 '아니요'인 경우 : 누구든지이 문제를 해결할 수있는 좋은 방법이 있습니까? 어떤 종류의 이미지 버퍼에 페인트해야합니까, 최근 페인트 호출을 추적하십시오 & 가능하면 이미지를 복사 하시겠습니까? 이것이 렌더링보다 훨씬 빠르다는 것을 상상할 수는 없지만 어떤 통찰력이라도 알 수 있습니다 .-)

답변

4

.NET에서이 문제가 발생했습니다. 이중 버퍼링으로 문제가 해결됩니다.

화면에 표시된 서페이스로 직접 렌더링하는 경우 "표시 중"이 실제로 발생하는 시점을 제어 할 수 없습니다. 일반적으로 렌더링이 시작되고 아직 완료되지 않은 이미지가 화면에 표시되고 렌더링이 끝난 다음 최종적으로 화면에 표시됩니다.

배경색을 지워 렌더링 논리를 시작하면 플래시처럼 보입니다. 이중 버퍼링은 완료된 렌더링에서 항상 표시되기 때문에이 문제를 방지합니다. 일어날 수있는 최악은 약간의 '찢어짐'이지만 빠르게 변화하는 애니메이션에서만 눈에.니다.

거대한 이미지의 일부만 렌더링하려는 경우에도이 기술을 사용할 수 있습니다. 원하는 부분을 화면 밖의 표면에 렌더링하면됩니다 (원하는 보이는 부분의 크기). 그리고 작업이 끝나면 전체 이미지를 디스플레이 표면에 그려 넣으십시오.

+0

내 유일한 문제는 전체 이미지를 버퍼링 할 수 없다는 것입니다. 너무 큽니다. 버퍼링 된 섹션을 그린 상태로 유지해야하므로 필요에 따라 페인트()하고 함께 바느질 할 때 적용 범위를 확인하십시오. 나는 그것을 시도해 볼 것 같지만 아무도 다른 아이디어가 있는지 보지 않을 것이다. –

+0

글쎄, 이중 버퍼링이 여전히 생겨날 수있다. 스크린 밖의 표면 (보이는 부분의 크기)에서 필요한 것을 렌더링하십시오. 그리고 작업이 끝나면 전체 이미지를 디스플레이 표면에 그려 넣으십시오. – colithium

+0

실제로이 방법이 효과적입니다.고마워요 :-) 스크롤은 조금 느리지 만 깜박임은 사라졌습니다. 미안해. 처음에는 못 봤어. 내 어리 석음은 너의 인내심에 맞지 않았다 ;-) –

관련 문제