簡體   English   中英

java 2D和swing

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM