Java 图形对象没有';不能在方法内部工作

Java 图形对象没有';不能在方法内部工作,java,Java,考虑java中的以下代码片段: 类:GraphPanel.java package graph_draw; import graph_draw.LocationPrinter; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.RenderingHints;

考虑java中的以下代码片段: 类:GraphPanel.java

package graph_draw;

import graph_draw.LocationPrinter;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JPanel;

@SuppressWarnings("serial")
class GraphPanel extends JPanel {

    private Color lineColor = new Color(44, 102, 230, 180);

    private List<Point> graphPoints = null;
    private static Graphics2D gra2;

    public GraphPanel(List<Point> gPoints) {
        graphPoints = gPoints;        
    }    

    @Override
    public void paintComponent(Graphics g) 
    {
        super.paintComponent(g);
        //gra2 = (Graphics2D)g;
          gra2 = (Graphics2D)g.create();

        gra2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        drawGraph(gra2, graphPoints);
    }

    public void drawGraph(Graphics2D g2, List<Point> graphPoints)
    {
        Graphics2D g = (Graphics2D)g2;

        g.setColor(lineColor);

        int x1 = graphPoints.get(0).x;
        int y1 = graphPoints.get(0).y;

        int x2 = graphPoints.get(1).x;
        int y2 = graphPoints.get(1).y;

        int x3 = graphPoints.get(2).x;
        int y3 = graphPoints.get(2).y;

        int x4 = graphPoints.get(3).x;
        int y4 = graphPoints.get(3).y;

        int x5 = graphPoints.get(4).x;
        int y5 = graphPoints.get(4).y;

        g.drawLine(x1, y1, x2, y2);
        g.drawLine(x2, y2, x3, y3);
        g.drawLine(x2, y2, x4, y4);
        g.drawLine(x3, y3, x4, y4);
        g.drawLine(x2, y2, x5, y5);
        g.drawLine(x3, y3, x5, y5);

    }

    public static void drawNewColoredLine(List<Point> lst)
    {
        Graphics2D g21 = (Graphics2D)gra2;  // gra2 is 'null' here. So g21 is null. Hence: NullPointerException.

        g21.setColor(Color.GREEN);
        int SIZE = lst.size();

        for(int i = 0; i < SIZE -1 ; i++)
        {
            int xa = lst.get(i).x;
            int ya = lst.get(i).y;

            int xb = lst.get(i+1).x;
            int yb = lst.get(i+1).y;

            g21.drawLine(xa, ya, xb, yb);
        }       
    }


    public static void createAndShowGui(List<Point> graphPoints) {        

        GraphPanel mainPanel = new GraphPanel(graphPoints);
        mainPanel.setPreferredSize(new Dimension(1366, 768));
        JFrame frame = new JFrame("DrawGraph");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

    }
}
包装图\u绘制;
导入图形绘制位置打印机;
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.Point;
导入java.awt.RenderingHints;
导入java.util.List;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
@抑制警告(“串行”)
类GraphPanel扩展了JPanel{
专用颜色lineColor=新颜色(44、102、230、180);
私有列表图点=null;
专用静态图形2d-gra2;
公共图形面板(列出gPoints){
图点=gPoints;
}    
@凌驾
公共组件(图形g)
{
超级组件(g);
//gra2=(图2d)g;
gra2=(Graphics2D)g.create();
gra2.setRenderingHint(renderingHits.KEY\u ANTIALIASING,renderingHits.VALUE\u ANTIALIAS\u ON);
绘图(gra2,图点);
}
公共空心绘图(图形2D g2,列表图形点)
{
图形2d g=(图形2d)g2;
g、 setColor(lineColor);
int x1=图形点。获取(0).x;
int y1=图形点.get(0).y;
int x2=图形点。获取(1.x);
int y2=图形点。获取(1.y);
int x3=图形点.get(2).x;
int y3=图形点.get(2).y;
int x4=图形点.get(3).x;
int y4=图形点.get(3.y);
INTX5=图形点.get(4).x;
int y5=图形点.get(4.y);
g、 抽绳(x1、y1、x2、y2);
g、 抽绳(x2、y2、x3、y3);
g、 抽绳(x2、y2、x4、y4);
g、 抽绳(x3、y3、x4、y4);
g、 抽绳(x2、y2、x5、y5);
g、 抽绳(x3、y3、x5、y5);
}
公共静态无效drawNewColoredLine(列表lst)
{
Graphics2D g21=(Graphics2D)gra2;//gra2在这里为“null”。因此g21为null。因此:NullPointerException。
g21.setColor(颜色为绿色);
int SIZE=lst.SIZE();
对于(int i=0;i
现在包含main的类- 类:DriverClass.java

package graph_draw;

import java.awt.Point;
import java.util.ArrayList;
import java.util.List;

public class DriverClass {

    public DriverClass() {
        // TODO Auto-generated constructor stub
    }

    public static void main(String[] args)
    {       
        List<Point> graphPoints = new ArrayList<>();

        // add points here.

        graphPoints.add(new Point(358, 237));
        graphPoints.add(new Point(366, 467));
        graphPoints.add(new Point(661, 468));
        graphPoints.add(new Point(636, 229));
        graphPoints.add(new Point(527, 648));

        GraphPanel.createAndShowGui(graphPoints);

        List<Point> ls = new ArrayList<Point>();

        ls.add(graphPoints.get(0));
        ls.add(graphPoints.get(1));
        ls.add(graphPoints.get(3));
        ls.add(graphPoints.get(2));
        ls.add(graphPoints.get(4)); 

        GraphPanel.drawNewColoredLine(ls); // not working.          
    }    
}
包装图\u绘制;
导入java.awt.Point;
导入java.util.ArrayList;
导入java.util.List;
公共级驾驶舱{
公共驾驶课(){
//TODO自动生成的构造函数存根
}
公共静态void main(字符串[]args)
{       
List graphPoints=new ArrayList();
//在这里添加点。
添加(新点(358237));
添加(新点(366467));
添加(新点(661468));
添加(新点(636229));
添加(新点(527648));
GraphPanel.createAndShowGui(graphPoints);
List ls=新的ArrayList();
ls.add(graphPoints.get(0));
ls.add(graphPoints.get(1));
ls.add(graphPoints.get(3));
ls.add(graphPoints.get(2));
ls.add(graphPoints.get(4));
GraphPanel.drawNewColoredLine(ls);//不工作。
}    
}
问题:在类
DriverClass.java
的最后一行中,调用了静态方法“
drawNewColoredLine
”,其中包含一个列表作为参数。我想使用静态对象“gra2”作为所有方法(如“
drawNewColoredLine
”)的图形对象


'gra2'
初始化为方法
'paintComponent'
中的图形对象
'gra2'
适用于方法“
drawGraph”
。但是对于“drawNewColoredLine”方法来说,这并不可怕,因为它引发了一个空指针异常。['gra2'在
'drawNewColoredLine'
]中为空。那么,如何让它在
'drawNewColoredLine'
中工作?

有什么理由使用静态方法吗?你应该摆脱它。您创建了GraphPanel类的对象,但并没有该类的引用,所以在调用另一个静态方法后,并没有如您所期望的那样初始化字段。尝试删除所有静态,删除createAndShowGui中创建新对象的操作,并调用如下内容:

....
GraphPanel graphPanel = new GraphPanel(graphPoints);
graphPanel.createAndShowGui(graphPoints); // actually you don't need to pass it again.
....
graphPanel.drawNewColoredLine(ls);
....

不应存储在
paintComponent
中接收的
Graphics
对象。 相反,从
paintComponent
中调用所有绘制代码,并将
Graphic2D
对象传递给其他绘制函数,就像对
drawGraph
所做的那样

public void paintComponent(Graphics g) 
{
    super.paintComponent(g);
    //gra2 = (Graphics2D)g;
      gra2 = (Graphics2D)g.create();

    gra2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

    drawGraph(gra2, graphPoints);
}

public void drawGraph(Graphics2D g, List<Point> graphPoints)
{

    g.setColor(lineColor);
....
....
公共组件(图形g)
{
超级组件(g);
//gra2=(图2d)g;
gra2=(Graphics2D)g.create();
gra2.setRenderingHint(renderingHits.KEY\u ANTIALIASING,renderingHits.VALUE\u ANTIALIAS\u ON);
绘图(gra2,图点);
}
公共空白绘图图(图2D g、列表图点)
{
g、 setColor(lineColor);
....
....

我没有使用“Graphpanel”对象访问方法,因为在“createAndShowGui”方法中,创建了另一个“Graphpanel”类型的对象。但是,您的答案并不是我问题的解决方案。:(当您调用Graphpanel.drawNewColoredLine(ls)时);您没有对GraphPanel.createAndShowGui(graphPoints)中创建的GraphPanel对象的引用;这就是为什么您在那里有null。摆脱静态,这样编写代码是非常糟糕的做法。我想先绘制一个图形。然后在某个特定时刻,我想在gr中突出显示一个具有不同颜色的路径