Java继承Canvas的Grapher类调用getGraphics()返回null原因求解
getGraphics()返回null的核心原因
- 最直接的错误:你操作的
Grapher实例从未被挂载到显示容器
你在main方法里新创建的Grapher Maker = new Grapher();只是一个普通的内存对象,没有被添加到JFrame等显示容器中,也没有完成屏幕渲染绑定。getGraphics()方法仅当组件已经完成native屏幕资源挂载、真实显示在界面上时才会返回有效Graphics对象,未挂载的组件调用该方法必然返回null。 - 操作的对象和界面显示的画布完全无关
你添加到JFrame中显示的是new Drawing()实例,和后面调用setPoint的Maker是两个完全独立的对象,就算你修复了挂载问题,你操作Maker也不会对界面上显示的画布产生任何影响。 - 额外设计问题:不建议直接使用
getGraphics()进行绘图
该方法拿到的是临时Graphics对象,一旦窗口触发重绘(比如最小化、拉伸大小、被其他窗口遮挡后恢复),你之前绘制的所有内容都会被清空。正确的实现逻辑是把所有需要绘制的坐标点存在一个集合中,统一在重写的paint()方法里遍历绘制,需要新增内容时更新集合后调用repaint()触发重绘即可。
快速修复方案(仅解决空指针问题,推荐后续调整绘图逻辑)
把main方法里的对应代码:
Canvas canvas = new Drawing(); // ... Grapher Maker=new Grapher(); Maker.setPoint(xval,yval);
修改为:
Grapher canvas = new Grapher(); // 省略原有将canvas添加到frame、设置窗口可见的代码 canvas.setPoint(xval,yval);
即可解决空指针问题。
内容的提问来源于stack exchange,提问作者A Beautiful Rose
相关产品推荐
相关产品推荐

