2014-10-28 63 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是一个完整的例子。