2013-11-24 82 views
1

我想解決以下問題:編寫一個顯示奧運五環的程序。用奧林匹克顏色對環進行着色。提供一種繪製給定位置和顏色的環的方法。創建自定義方法繪製 - 圖形2D g2爲空


我有一個主要問題,我的理解是如何完全對象的圖形工作。我最初嘗試使用getGraphics()將它作爲參數傳遞給該方法,但是我發現通常可以避免使用此方法,因爲可能會發生空例外情況。所以我讀到你應該重寫組件類中的paintComponent方法?所以我試圖通過創建一個包含重寫和我的drawRing方法的類,使Graphics2D g2成爲一個實例變量,但是我仍然在drawRing的第一行中調用它時收到空錯誤。我一直試圖找出幾個小時,但我真的不知道如何解決這個問題,使該方法可以訪問主框架,如果有一個完全不同的方式我應該解決它。任何幫助深表感謝。


而且,我只是想指出,我還沒開始佔x和y在我drawRing方法座標以及顏色,我首先要確保該程序可以訪問該方法時,它可以畫在主要的首先製作的框架上,之後我將這些細節描繪得相當簡單。


我的代碼:

import javax.swing.*; 
import java.awt.*; 
import java.applet.*; 
import java.awt.geom.*; 
public class test{ 
    public static class ringComponent extends JComponent{ 
     private Graphics2D g2; 
     public void paintComponent(Graphics g){ 
      g2 = (Graphics2D) g; 
     } 
     public void drawRing(){ 
      g2.setColor(Color.RED);//Null error here 
      Ellipse2D.Double circle = new Ellipse2D.Double(50, 50, 200, 200); 
      g2.draw(circle); 
     } 
    } 
    public static void main(String[] args){ 
     JFrame frame = new JFrame(); 
     final int FRAME_WIDTH = 800; 
     final int FRAME_HEIGHT = 800; 
     frame.setSize(FRAME_WIDTH,FRAME_HEIGHT); 
     frame.setTitle("Olympic Rings"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     ringComponent rc = new ringComponent(); 
     rc.drawRing(); 
     frame.add(rc); 
     frame.setVisible(true); 
    } 
} 

回答

2

你不應該定義一個「g2」變量。

您不應該調用drawRing()方法。

相反,drawRing()方法中的代碼應放置在paintComponent()方法中。然後,Swing將在組件需要重新繪製時自動調用paintComponent()方法。

有關更多信息和工作示例,請參閱Custom Painting的Swing教程中的部分。

+0

這實際上是我學會繪製的方式,但這樣做我不能做一個單獨的方法,可以採取座標和字符串作爲參數,這是我的問題的來源,因爲我不能改變paintComponent的參數。 – Reddy

+0

'我不能做一個單獨的方法,可以座標和字符串作爲參數' - 確定你可以。您可以將任何方法添加到您想要自定義繪畫的課程中。這就是Swing組件的工作原理。諸如setText(),setForeground(),setBackground()之類的方法都會影響組件的繪製方式。如果你有特殊的繪畫要求,那麼你可以創建適當的「setter」方法,讓你改變這些值。然後在setter方法中調用'repaint()',組件將重新繪製自己。 – camickr

+0

所以,如果有可能在課堂上做出我自己的方法,我會如何去做呢?如果我在paintComponent方法中聲明瞭方法,我得到了表達式錯誤的非法開始,並且在外面聲明它正是我在上面嘗試的那個方法不起作用。 – Reddy

1

當然g2爲空。您尚未撥打paintComponent,因此尚未初始化。

+0

我嘗試使用以下命令調用paintComponent:rc.paintComponent(frame.getGraphics());就在rc.drawRing()之前;但其相同的空錯誤。 – Reddy