2013-08-01 83 views
4

我希望這個問題不會被視爲太籠統。我明白,要使用JPanel來覆蓋paintComponent方法,並將所有繪圖代碼放入該方法中。我的問題是爲什麼!爲什麼Java似乎不允許/提供使用諸如panel.drawLine(x1,y1,x2,y2)panel.drawText(text,x,y)等方法的繪圖?在Delphi中這一切都變得容易多了。我必須有一個原因,我無法弄清楚。爲什麼需要使用paintComponent方法來繪製Java?

回答

10

這是因爲這是它的工作方式。它是這樣設計的。不過,我想你的問題是關於「爲什麼」

記住,鞦韆第一近15年前就出來了。其中一個批評是API太慢了(事實上,速度很慢,因爲人們沒有真正理解如何使用它,但這是另一回事),所以API必須在設計時考慮到性能。

有涉及到許多因素...

搖擺採用被動烤漆工藝,這意味着塗料請求進行處理油漆子系統和時間表(回到了EDT)製成。油漆子系統決定什麼時候以及應該塗多少油漆。這是在褻瀆塗料子系統的情況下完成的。

這意味着你永遠不會真正知道什麼時候可以被執行的油漆週期,所以我們需要一些方法,以便能夠響應這些請求。

多功能性是另一個因素。 API足夠抽象,以至於組件被繪製到的地方並不重要(很多)。也就是說,你可能被畫到屏幕,打印機甚至圖像上。這意味着您不必重複大量的代碼就可以在不同的設備上工作。

你也永遠不知道當一個分量將成顯示(即,當它成爲連接到本地同行)。這意味着圖形上下文可能是null,所以擁有「幫助器」方法可能會導致更多問題。當調用paintComponent時,(主要)保證有一個有效的圖形上下文進行繪製。

擴將是另一個因素。不僅如此,覆蓋paintComponent以改變某些組件的繪製方式非常簡單,與當前情況一樣,繪製系統也可以提供擴展的Graphics上下文。當paintComponent被調用時(至少被paint子系統調用),它保證Graphics上下文將是Graphics2D的一個實例,它是Graphics的擴展,爲API提供了許多重要的增強。

這樣做完全不需要改變人們使用的基類,所以如果他們不想使用這些功能,他們仍然不受影響。

您可能需要採取通讀...

詳情

記住 「畫畫是有趣的」;)

更多的想法

需要考慮的其他因素之一是,API不僅僅是考慮用戶界面,而且還包括打印和圖像處理,因此API是繪畫的核心。 API與其目標分離,允許更大的靈活性,但也是通用性。

這意味着如果您需要打印到打印機或渲染圖像,您可以使用相同的API來繪製屏幕。

+0

啊,我現在應該刪除我的答案。很好的回答+1。 –

相關問題