2010-12-10 6 views
0

고정 된 큰 (그러나 고정 된) 벡터 이미지를 그리고 이미지의 일부를 뷰 포트 (절대 위치가 아닌)에 상대적으로 표시해야하는 텍스트로 오버레이하는 스윙 구성 요소가 있음 - 고정 행으로 생각 함 Excel에서 라벨 (아래 그림 참조) :자바 스윙 클리핑 문제

Header 
-- [some stuff] ----- [ some stuff] ---- 
Header2 
----- [some stuff] ----- [ some stuff] ---- 

왼쪽에서 오른쪽으로 스크롤하는 경우를 제외하고는 정상적으로 작동합니다.

public void paintComponent(Graphics graphics) { 
    Graphics2D g = (Graphics2D)graphics; 
    Shape oldClip = g.getClip(); 

    Rectangle clipBounds = getVisibleRect(); 
    g.setClip(clipBounds); 

    drawMyImage(); 
    drawMyHeaders(); 

    g.setClip(oldClip); 
} 

그러나,이 작동하지 않습니다 그러나이 작업 표시되지 않습니다 - 나는 전체 뷰포트가 항상 그려되도록의 paintComponent() 메소드의 가시 영역에 클립 경계를 설정하려고 보이는 영역이 올바른 모양이지만 클립을 설정해도 아무 효과가 없습니다. 내가 무엇을 할 수 있을지?

clip: java.awt.Rectangle[x=1762,y=0,width=57,height=182] // clipped while scrolling 
vis: java.awt.Rectangle[x=1762,y=0,width=582,height=182] // what I want to paint 
+2

'paintComponent'에서'setClip'을 사용하지 마십시오! 클리핑 영역은 Swing에서 사용됩니다. –

+0

분명히 더 나은 접근법을 요구하고 있습니다. 그러나 가시 영역, 그리기, 복원에 아무런 해를 끼치 지 않아야합니다. 스윙은 스크롤하는 동안 클립이 더러운 영역으로 설정되어 그래픽 서브 컨텍스트를 제공 할 수 있도록합니다. – Justin

답변

2

당신은 그래픽이 헤더에 객체를 전달되지 않으므로 아마 실 거예요 당신의 클리핑 형태가 설정되어 다른 것을 통해 그림해야합니다.

주석 처리 된대로 paintComponent에서 setClip을 사용하지 마십시오! 클리핑 영역은 Swing에서 사용됩니다.

스크롤 구성 요소 위에 레이어 오버레이 구성 요소가있는 것으로 보이는 것 같습니다.

+0

모든 타임 라인 구성 요소의 일부로 페인팅됩니다. 헤드 라인의 위치 계산은 타임 라인의 페인팅 중에 나옵니다. 따라서 두 번째 스윙 구성 요소를 맨 위에 오버레이하고 싶지는 않습니다. – Justin

+0

오버레이 구성 요소가 스크롤 창에 제대로 그려 지도록 위치를 설정하는 방법은 무엇입니까? – Justin

+0

@ Justin 레이아웃 관리자가 없으면 스크롤 영역이 움직일 때 상위 컴포넌트 내에서 위치를 설정하면됩니다. 수평 및 수직 스크롤을 분리 할 수 ​​있지만 부작용이있을 수 있습니다. –