2014-01-07 2 views
2

Graphics2D 객체를 사용할 때 대상 버퍼의 어느 부분을 다시 그려야하는지 알 수있는 올바른 방법은 무엇입니까? 전체 버퍼를 다시 그려야하는 경우, 대상 버퍼의 크기는 무엇입니까?스윙에서 다시 칠 때 Graphics2D의 더티 영역 확인

대상 버퍼는 BufferedImage, AWT 구성 요소 또는 인쇄시 사용되는 가상 장치 일 수 있습니다. 패턴으로 배경을 바둑판 식으로 배열하는 것과 같은 일부 작업의 경우, 다시 칠하는 작업을 최적화하지 않고도 어떤 영역을 칠해야 하는지를 알아야합니다.

Graphics.getClipBounds()을 사용해 보았지만, 가끔 null을 반환합니다. 내가 믿고있어

당신이 다시 그리도록 요청받을 수있는 몇 가지 방법이있다 스윙에서 Rectangle2D getInvaidRegion() 또는 Rectangle2D getDestinationBufferSize()

+0

무슨 뜻인지 이해가되지 않습니까? 왜 다시 그려야합니까? –

+0

@TimB 가장 가까운 내가 찾을 수있는 _.NET_ 프레임 워크에서 해당 : [PaintEventArgs.ClipRectangle] (http://msdn.microsoft.com/en-us/library/system.windows.forms.painteventargs.cliprectangle (v = .110) .aspx). 늘 그렇듯이, 설명은 존재하지 않지만, 다음과 같습니다 : 이벤트의이 속성은 항상 백업 버퍼의 어느 부분을 다시 그려야하는지 알려줍니다. 버퍼의 일부만 무효화 된 경우 전체 버퍼 또는 버퍼의 일부 일 수 있습니다. – Feuermurmel

+0

그래서 다시 그릴 더러운 영역을 알 수 있도록 Swing 다시 칠하기 요청이 들어 왔을 때입니까? –

답변

1

의 라인을 따라 몇 가지 방법이있다.

가장 단순한 방법은 paintComponent이며 모든 것을 그릴 수 있습니다. 테두리와 하위 구성 요소가 자동으로 처리됩니다.

다음으로 가장 복잡한 것은 paint을 무시하는 것입니다. 이제 경계와 하위 구성 요소를 처리해야합니다. 당신을 위해 거의

http://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent.html#paintImmediately%28int,%20int,%20int,%20int%29

이이 더러운 영역 통보 만 수행합니다

마지막으로 당신은 당신이 대체 할 수 있습니다 paintImmediately 있습니다.

+0

paintImmediately는 EDT에서 호출해야합니다. 그렇지 않으면 RepaintManager에서 몇 가지 예외가 발생합니다. 예외가있는 경우에는 예외가 있지만 경우에 따라 스윙 GUI를 작업 관리자에서만 종료 할 수 있습니다. – mKorbel

+0

결과 일 수 있습니다. 'RepaintManager'를 오버라이드 (예기치 않게 일부 픽셀을 다시 그릴 수 있는지 여부를 결정할 수 있음) 또는 사용 repaint (x, x, x, x ....) – mKorbel

+0

BufferedImage '또는 java.awt.print.Printable.print()의 구현으로부터?이 경우 각각 특수한 경우에 도장 코드를 사용해야합니까? – Feuermurmel

관련 문제