2014-01-07 43 views
2

使用Graphics2D對象時,找出目標緩衝區的哪一部分需要重新繪製的正確方法是什麼,或者如果需要重新繪製整個緩衝區,目標緩衝區的維度是什麼?在Swing中重繪時識別Graphics2D的髒區域

目標緩衝區可能是BufferedImageAWT組件或打印時使用的虛擬設備。對於某些操作,例如使用圖案平鋪背景,即使沒有優化重新繪製的意圖,也需要知道哪個區域需要着色。

我試過使用Graphics.getClipBounds(),但有時會返回null

我假設有沿Rectangle2D getInvaidRegion()Rectangle2D getDestinationBufferSize()

+0

我不明白你的意思?什麼部分需要重繪爲什麼? –

+0

@TimB我能找到的最接近的是_.NET_框架中的等價物:[PaintEventArgs.ClipRectangle](http://msdn.microsoft.com/zh-cn/library/system.windows.forms.painteventargs.cliprectangle( v = vs.110)的.aspx)。像往常一樣,描述是不存在的,但是它的作用如下:事件的這個屬性總是告訴你需要重繪的後備緩衝區的哪一部分。這可能是整個緩衝區的一部分,或者只是其中的一部分,只要緩衝區的一部分已經失效。 – Feuermurmel

+0

所以這是當一個Swing重繪請求進來,所以你知道髒區重繪? –

回答

1

線在Swing一些方法也有,你可以要求重畫了幾個不同的方式。

在最簡單的情況下,您可以覆蓋paintComponent,只需繪製所有內容,即可處理邊框和子組件。

接下來最複雜的是覆蓋paint。您現在需要處理邊框和子組件。

最後你paintImmediately,你可以重寫:

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

這是通知髒區域,但確實很少給你。

+0

paintImmediately必須從EDT中調用,否則會導致RepaintManager出現一些awfull異常,然後取決於例外tyoe(s),但在某些情況下,結果可能是Swing GUI只能從任務管理器終止 – mKorbel

+0

結果可能是重寫'RepaintManager'(可以意外地決定某個像素是否可以重新繪製)或使用重繪(x,x,x,x ....) – mKorbel

+0

如果我畫一個'BufferedImage '或者來自'java.awt.print.Printable.print()'的實現?我是否需要爲這些情況中的每一種特殊情況繪製代碼? – Feuermurmel