[英]java 2D and swing
我很難理解Java 2D中的基本概念。
舉一個具體的例子:
可以通過實現自己的方法paintComponent(Graphics g)
定義一個swing組件。
圖形可用於該方法的主體。
題:
這個Graphics對象到底是什么,我的意思是它與具有方法paintComponent
的對象有什么關系? 好的,我知道您可以執行以下操作:
g.setColor(Color.GRAY);
g.fillOval(0, 0, getWidth(), getHeight());
得到一個灰色的橢圓形畫。 我不明白的是Graphics對象與組件和畫布之間的關系。 這張圖實際上是如何完成的?
另一個例子:
public class MyComponent extends JComponent {
protected void paintComponent(Graphics g) {
System.out.println("Width:"+getWidth()+", Height:"+getHeight());
}
public static void main(String args[]) {
JFrame f = new JFrame("Some frame");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(200, 90);
MyComponent component = new MyComponent ();
f.add(component);
f.setVisible(true);
}
}
此打印
寬:184,高:52
這個大小是什么意思? 我沒有在size(200,90)的框架中添加任何內容。
更新:
我知道我必須重寫paint以在Graphics g
對象中提供進行重新繪制所需的提示,並且我不必創建Graphics
對象,因為平台將提供該對象。
在那之后發生的事情是我無法理解的。
例如,當我開始調用各種g.setXXX
方法時,“ Graphics
代表屏幕,並相應地在屏幕上繪制對象?
它是否存儲在隊列中,並且g
與每個component
之間存在1-1關聯? 因此,框架使用每種成分的每g
一次繪制一次嗎?
這是如何運作的? 我們對此表示任何幫助
謝謝
在學習Java圖形時,我為解決這一問題而苦苦掙扎了一段時間,因此我了解您的問題。 不只是Java 2D圖形-它還是AWT的一部分。
當您創建JFrame或其他一些頂級對象時,它會在“幕后”做很多工作-其中一部分是創建Graphics對象。 (雖然沒有明確通知,但是如果您使用調試器逐步執行代碼,則可能會看到創建Graphics的類)。
然后,您創建要添加或注冊頂級對象的組件。 這些都必須實現回調方法,包括
paint(Graphics g);
然后,您將@Override這些方法,以便在渲染組件時使用您的繪制方法。
不要嘗試保存圖形或創建新圖形。 將其視為承擔責任的框架。
組件的大小通常不費吹灰之力。 如果使用布局管理器,則它可能會決定調整組件的大小。
如果您來自程序性命令背景,那么您可能會遇到問題(我來自FORTRAN)。 我的建議是嘗試一些教程,並且-在某個階段-啟迪將開始。
Java圖形的常規文檔很差。 有許多不透明的概念(請參閱Java Graphics.drawImage()的工作方式以及ImageObserver的作用 )。 早期的實施很匆忙,存在許多錯誤。 即使到現在,也常常不清楚是否應該以什么順序調用諸如setPack()
和setVisible()
。
這並不意味着您不應該使用它! 只是學習曲線比IMO長一些。
更多:同樣,您也不必確定何時繪制某些東西,而框架會確定。 paint(g)
真正含義是“ framweork正在重新粉刷其組件。您希望此組件在此階段提供什么?”。
也許providePaintingInstructionsWhenRequiredForComponentGraphics(Graphics g)
是一個有用的名稱。
同樣, repaint()
不會按您的訂單重畫,而是在系統認為應該的時候重畫。 我還沒有發現它有用。
如果您(說)以交互方式調整組件的大小,通常每個微小的更改都會觸發paint(g)
。 嘗試將LOG.debug()放入繪畫代碼中,看看它何時被調用。
這個大小是什么意思? 我沒有在size(200,90)的框架中添加任何內容。
您將組件添加到框架,並將框架的大小設置為(200,90)。 框架內容窗格的默認布局管理器是BorderLayout,這意味着添加的組件將獲取所有可用空間。 框架需要一些空間來容納標題欄和邊框,因此組件將獲得剩余空間。
該組件不會創建靜態Graphics對象關聯。
圖形對象是平台句柄的包裝,可用於訪問物理設備(例如屏幕)。 僅在執行“繪畫”時有效,您不能存儲它,以后再使用。 它是由“工具箱”管理的資源。
組件本身是窗口系統頂部的抽象,它很快與此設備關聯以進行渲染。
編輯
如果您認為需要從“ paint”回調中進行繪制,則可以強制調用“ getGraphics”這樣的關聯。 這應該是非常少見的情況,您始終應在以后處置圖形。
將Graphics
想象成一張紙,您可以用它畫出該Component
在那時的外觀。 繪制完之后,框架工具包將修剪掉邊緣並顯示您繪制的內容以顯示組件。 此外,下次繪制組件時,您將在另一張紙上進行繪制,因此不要保留舊的Graphics
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.