import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Test{
public static void main(String[] args) {
JFrame f = new JFrame();
JPanel p = new JPanel();
Graphics g = p.getGraphics();
g.drawRect(100, 100, 100, 100);
f.add(p);
f.setSize(300,300);
f.setVisible(true);
}
}
报空指针异常错误
Exception in thread "main" java.lang.NullPointerException
at frame.Test.main(Test.java:15)
帮助我改成功!!!谢谢
Graphics 画图问题
答案:2 悬赏:30 手机版
解决时间 2021-02-23 09:03
- 提问者网友:凉末
- 2021-02-22 15:03
最佳答案
- 五星知识达人网友:不甚了了
- 2021-02-22 15:52
这个是初学者很常见的问题,多写程序就会注意到了。
先跟你讲一下怎么会出错的:
getGraphics() 这个方法返回组件的 Graphics 对象,前提是它得有 Graphics 对象,不是 new 了 JPanel 就立马会有 Graphics 对象的,因为你还没设置它应该出现的区域,它没办法显示出来(Graphics 对象其实就是这个显示区域,显示不出来 Graphics 对象就是空的,于是出现了你的 NullPointerException 错误)。
(你如果去掉中间那两句以后运行的话你会发现根本看不到 JPanel(当然 JPanel 上不加东西或者不改背景色或者不加边框总是看不见的,你可以试试其它的,像 JButton 之类的,都是一样的)。)
于是解决办法是在 Graphics g = p.getGraphics(); 上面加上:
f.setBounds(100, 100, 300, 300);
这样就可以了。(swing 默认是 BorderLayout 的,也就是如果底层容器上就一个组件,那个组件不用设置显示区域,会自动铺满底层容器。具体请参考 JDK 的布局管理 LayoutManager 和 BorderLayout 的说明)。
------------------------------------------------
希望你耐心、仔细地看完了。
先跟你讲一下怎么会出错的:
getGraphics() 这个方法返回组件的 Graphics 对象,前提是它得有 Graphics 对象,不是 new 了 JPanel 就立马会有 Graphics 对象的,因为你还没设置它应该出现的区域,它没办法显示出来(Graphics 对象其实就是这个显示区域,显示不出来 Graphics 对象就是空的,于是出现了你的 NullPointerException 错误)。
(你如果去掉中间那两句以后运行的话你会发现根本看不到 JPanel(当然 JPanel 上不加东西或者不改背景色或者不加边框总是看不见的,你可以试试其它的,像 JButton 之类的,都是一样的)。)
于是解决办法是在 Graphics g = p.getGraphics(); 上面加上:
f.setBounds(100, 100, 300, 300);
这样就可以了。(swing 默认是 BorderLayout 的,也就是如果底层容器上就一个组件,那个组件不用设置显示区域,会自动铺满底层容器。具体请参考 JDK 的布局管理 LayoutManager 和 BorderLayout 的说明)。
------------------------------------------------
希望你耐心、仔细地看完了。
全部回答
- 1楼网友:第幾種人
- 2021-02-22 17:12
最大化图形消失的问题也解决了,注意类名首字母大写 import java.awt.*; import java.awt.event.*; import java.util.arraylist; import javax.swing.*; public class map { public static void main(string[] args) { new draw(); } } class draw extends jframe{ arraylist<point> points = new arraylist<point>(); jpanel p=new jpanel(); draw(){ add(p,borderlayout.center); p.addmouselistener(new mymouse()); this.addwindowstatelistener(new mywindow()); this.setresizable(true); validate(); setbounds(50,50,500,400); setvisible(true); } public void paint (graphics g){ for(int i = 0;i<points.size();i++){ g.filloval(points.get(i).x, points.get(i).y, 30, 30); } } private class mywindow implements windowstatelistener{ public void windowstatechanged(windowevent arg0) { repaint(); } } private class mymouse extends mouseadapter{ public void mouseclicked(mouseevent e) { points.add(e.getpoint()); repaint(); } } }
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯