2011-11-28 27 views
1

考慮一下我有一個JFrame和一個JPanel對象,JPanel對象嵌入在JFrame中。我的理解是,每個圖形組件都有它自己的圖形上下文。所以我的JFrame有它自己的圖形上下文,我的JPanel有它自己的圖形上下文,這些上下文是不同的。我組建了一個小測試,這似乎否則雖然暗示:如何爲嵌入式圖形組件獲取獨特的圖形上下文?

JFrame frame = new JFrame(); 
    JPanel panel = new JPanel(); 
    frame.add(panel); 

    Graphics frameContext = frame.getGraphics(); 
    Graphics panelContext = panel.getGraphics(); 

    if (frameContext == panelContext){ 
     System.out.println("The contexts are the same."); 
    } else { 
     System.out.println("The contexts are different."); 
    } 

輸出是「環境是一樣的。」爲什麼會這樣? JPanel和JFrame有可能有不同的圖形上下文嗎?我想能夠繪製到JPanel圖形上下文,但不是JFrame上下文。

這個問題與Wrong JPanel displayed in CardLayout. Issues with getGraphics()有關。我相信這個問題的答案可能以某種方式解決另一個問題。

+0

無所謂 - 你不應該使用getGraphics(),永遠。正如你在早期的問題中已經告訴你的...... – kleopatra

+0

我一直在使用Andrew Davison的書_Jiller Game Programming in Java_作爲這個項目的參考。他似乎不同意。這本書的一句話是「由於repaint()的調用只是一個請求,所以很難知道重新繪製何時完成[...]。主動渲染將渲染緩衝區圖像的任務放到屏幕上這意味着渲染時間可以被精確測量,並且由於JVM的延遲或跳過重繪請求的擔憂消失。「 – jtan

回答

1

哇。愚蠢的錯誤在我身上。平等測試返回true,因爲它們都是空的。

的代碼應改爲:

JFrame frame = new JFrame(); 
    JPanel panel = new JPanel(); 
    frame.add(panel); 
    frame.setVisible(true); 

    Graphics frameContext = frame.getGraphics(); 
    Graphics panelContext = panel.getGraphics();   

    if (frameContext.equals(panelContext)){ 
     System.out.println("The contexts are the same."); 
    } else { 
     System.out.println("The contexts are different."); 
    } 

本變形例後,將試驗的輸出是「的上下文是不同的。」因此,這不能回答Wrong JPanel displayed in CardLayout. Issues with getGraphics()處的問題。