2011-11-17 5 views
4

기본적으로 나는 투명 JPanels 많은 그림입니다; 프로파일 링은 대부분의 시간이 Component.paint()에서 소비되었음을 보여줍니다. 대부분의 경우 JPanel 당 실제 불투명하지 않은 영역이 매우 작기 때문에 예를 들어 가장자리와 같이 매우 근본적으로 최적화 할 수 있습니다.특정 JPanel 영역을 불투명 한 것으로 표시하는 방법이 있습니까?

현재 Repainting() 컴포넌트는 모두 부모를 다시 트리거합니다. 왜냐하면 RepaintManager는 더러운 부모 영역이 실제로 불투명하다는 것을 알지 못하고 컴포넌트 계층을 올라갈 것이기 때문입니다. 패널이 무효화 될 때마다 모든 부모에 markCompletelyClean()을 호출하고 addDirtyRegion()으로 더티 영역을 직접 관리 할 생각이었습니다.

그러나 JPanel의 특정 사각형 만 불투명 (또는 투명, 중요하지 않음)으로 표시하는 더 선명한 방법이 있습니까?

답변

2

markCompletelyClean() 및 addDirtyRegion()을 사용하여 멋진 기능을 수행하더라도 많은 성능상의 이점을 얻을 수 있을지는 의문입니다. 다시 칠하기 위해 스윙을하면 더티 영역을 모두 페인팅하고 모든 더러운 영역의 최소 경계 상자로 다시 칠하기 시작합니다. 따라서 JPanel의 둘레를 더티로 표시하면 JPanel의 경계 상자는 전체 JPanel과 동일하므로 어떤 방식 으로든 전체를 다시 칠할 수 있습니다.

+0

적어도 깨끗한 것으로 표시하면 구성 요소의 모든 부모를 다시 채 웁니다. 예를 들어, 내가 루트가 아닌 불투명하지 않은 JPanel을 가지고 있기 때문에, 무언가가 바뀔 때마다 그것을 다시 그리는 것 (그리고 그것으로 이어지는 모든 것을 다시 그려야한다.)은 꽤 큰 성과가 될 것이다. –

+0

@PhilipK 그 분은 흥미로운 질문입니다. 그리고 나는 당신의 질문의 핵심을 추측합니다. 자바는 페인터 알고리즘을 사용합니다. 즉, 앞에서 뒤쪽으로 (부모에서 자식으로) 그리는 것을 의미하므로, 부모가 그려지지 않고 자식을 그릴 수있는 방법이 없습니다. 그러나 나는 불가능하다고 말하는 자바의 페인팅 알고리즘을 철저하게 알고 있지 않습니다. 코드를 살펴 봐야합니다. addDirtyRegion()이 부모를 더티라고 표시하지 않습니까? – heneryville

+0

내가 수집 한 것으로부터, 자식이 점령 한 직사각형이 변경되면 더러운 영역이 부모에 추가됩니다. 위치 또는 크기 변경으로 인해 5 개의 투명 패널과 최하위의 자식이 무효화되는 계층 구조를 가질 때 모든 자식 픽셀이 이론적으로 모든 부모에 의해 영향을받을 수 있기 때문에 모든 것이 다시 불투명 해지는 것입니다. . 하지만 더러운 영역이 사실은 불투명하다는 것을 알게되면 직계 부모에서 전파 체인을 중단합니다. 희망이 그게 이해가 되네 :) –

2

당신이 JPanel에 어떠한 JComponent 같은를 추가 할 수 있습니다 다음합니다 (JLabel에) 할 수 있습니다 (기본적으로 불투명) 대신 JPanelJLabel 사용을 고려하지만 LayoutManager을 설정해야합니다, 당신은에 대한 관리를 잊어 버렸습니다 Opacity/Transparency 및 내역의 지역 (들)

+1

나는 꽤 이해하지 못한다. setOpaque (false)를 사용하는 JPanel과 비교할 때 성능 측면에서 JLabel의 이점은 무엇입니까? –

1

에 왜 당신이 당신의 자신의 방법 myRepaint() 호출 여러 모든 경계에 대한

public void repaint(long tm, int x, int y, int width, int height) 

정의 할 수 없습니다?

그래픽의 clipBounds를 사용하여 실제로 필요한 부분 만 다시 칠해보세요. 사용자 지정 도형을 클립으로 설정할 수 있습니다.

+0

+1 내 질문에 EDT와 페인트에 대해 더 잘 이야기하지 않는다. 바로 '나는 투명 JPanels를 많이 그리고있다. – mKorbel

관련 문제