Java 图形对象没有';不能在方法内部工作
考虑java中的以下代码片段: 类:GraphPanel.javaJava 图形对象没有';不能在方法内部工作,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;
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中突出显示一个具有不同颜色的路径