2014-10-28 61 views
0

我已經擴展JPanel類來繪製圖形。我已經得到的問題是,我需要爲了把它在多個方法......作爲一個例子一個全球性的圖形對象,這裏就是我想要做的事:Java:創建全局圖形對象

public class Graph extends JPanel { 
    private Graphics2D g2d; 

    public void paintComponent(Graphics g){ 
    g2d = (Graphics2D)g; 
    } 

    public void drawGridLines(int hor, int vert){ 
    g2d.someLogicToDrawMyGridLines(someparams); 
    } 
} 

這將返回一個空指針異常 - 所以我的問題是:我如何創建一個全局圖形對象?這種情況下的最佳做法是什麼?

+0

爲什麼你需要一個全局圖形對象?爲什麼不能從'paintComponent'內部調用'drawGridLines',並將'Graphics'作爲參數傳遞? – khelwood 2014-10-28 11:51:40

+0

這就是我目前所擁有的 - 但是如果我要從另一個類中調用drawGridlines(),這是一個很好的解決方案嗎? – 2014-10-28 11:52:30

+0

最好將'Graphics'對象傳遞給你的幫助函數,而不是嘗試和存儲一個'Graphics'對象,這個對象可能被丟棄並且不再可用。 – khelwood 2014-10-28 11:53:41

回答

5

我的建議是這樣的:

public class Graph extends JPanel { 
    public void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     g2d = (Graphics2D) g; 
     drawGridLines(g2d, ......); 
    } 

    private void drawGridLines(Graphics2D g2d, int hor, int vert){ 
     g2d.someLogicToDrawMyGridLines(someparams); 
    } 
} 

即讓你的圖形上下文的所有用途paintComponent調用中。

+0

保理+1;在[tag:jfreechart]中的相應方法可以在['AbstractRenderer'](http://www.jfree.org/jfreechart/api/javadoc/org/jfree)的實現中的各種'drawXxx()'方法中看到/chart/renderer/AbstractRenderer.html)。 – trashgod 2014-10-28 12:24:43

5

如何從外部傳遞圖形對象?

不要。圖形上下文僅在調用paintComponent()期間有效。相反,使用MVC pattern(討論的here)來更新通知任何偵聽視圖進行呈現的模型。 JFreeChart是一個完整的例子。