2016-10-01 21 views
-2

我想訪問Graphics類來繪製一個矩形,但是想要這樣做,而不必調用paintComponent方法。可能嗎?用沒有paintComponent的Graphics可以繪製Java嗎?

+3

您的問題實際上可能是一個[XY問題](http://mywiki.wooledge.org/XyProblem),當您最好的解決方案是完全使用不同的方法時,您會問「如何解決此代碼問題」 。考慮告訴我們你想要解決的總體問題,而不是你目前如何解決問題。例如,*爲什麼*你想避免使用paintComponent?你有什麼嘗試?什麼不工作? –

+2

例如,是的,可以通過調用getGraphics()來繪製一個組件的Graphics上下文對象,然後使用該對象進行繪製,但這樣做可能會產生不穩定的圖像並拋出NullPointerExceptions,因爲以這種方式獲取的Graphics對象不是耐用。 –

+0

此外,一個不調用paintComponent()方法,對吧? –

回答

3

繪畫應始終以繪畫方式完成。

最常見的方法是在組件的paintComponent(...)方法中執行自定義繪畫。

另一種方法是使用JLayer類「裝飾」組件,並在JLayer的paint(...)方法中實施繪畫。請閱讀Decorating Components Using the JLayer Class上的Swing教程部分以獲取更多信息和示例。

3

是的,可以用相同的方式繪製BufferedImage(通過調用getGraphics()方法直接使用Graphics對象)。

但是,與BufferedImage的情況不同,對於組件這樣做可能會造成混亂。原因是底層AWT/Swing代碼期望組件自己繪製(參見Component.paintJComponent.paintComponent),而當此渲染需要發生時,它(底層的AWT/Swing代碼)將會處理大約(例如滾動,調整大小等)。因此,如果你從組件的外部繪畫,AWT/Swing在任何時候都決定「好吧,有一些新的繪畫/重繪要完成」,它會調用「標準方法」,期望你繪圖代碼在那裏。
當你在外部畫畫時,如果你沒有特別的安排來通知「需要重新繪畫」的情況,部分或整個「從外部畫」將被塗上或不塗上所有或全部有種不同的凌亂情況。

換句話說,如果你畫外之外,你需要編寫不僅不畫中的代碼,也:

  1. 的代碼重新實現堆已被執行AWT/Swing,它處理組件需要(重新)繪製的情況。
  2. 以某種方式禁用AWT/Swing「原生」處理繪畫。

請放心,你不想那(即使你認爲你這樣做)。

PS。如果你更好地描述爲什麼你需要這樣做,你可能會得到更多有用的建議,以便如何正確地做到這一點。

相關問題