//这些代码就是想在frame 窗口中画一条直线。
一. 返回空指针的错误代码。
public class Demo
{
public static void main(String[] args)
{
Frame f = new Frame();
f.setBounds(300,200,600,400);
f.getGraphics().drawLine(1,1,100,100); //这句话在编译时通过,但运行时却返回空指针异常
//好像是getGraphics()方法没有获得Graphics对象。
f.setVisible(true);
}
//但是这些代码却能正确执行。
二. 正确代码。
public class Demo
{
public static void main(String[] args)
{
Frame f = new Frame();
f.setBounds(300,200,600,400);
//先创建一个监听器,并注册到f中,
//再通在监听器中通过getSource()得/到 f,然后再调用getGraphics()方法就行了。
//这不相当于绕了一个弯路吗?
f.addMouseListener(new MouseAdapter(){
public void mousePressed(MouseEvent e)
{
e.getSource().getGraphics().drawLine(1,1,100,100);
}
});
f.setVisible(true);
}
//怎样直接就能在f中画图呢???
还有就是另一个问题:
我自定义一个类 叫 t 让他继承Frame 类,这样我覆盖 paint()方法,这个方法不是在对象建立死自动调用的吗?这样在 t 类中去画图,根本不用考虑产生Graphics对象的问题。(因为paint()自动执行,所以也就不用我调用paint(),当然也就不用我建立Graphics对象来给paint传递实际参数。) 接下来请看代码:
class t extends Frame
{
public void paint(Graphics g)
{
g.drawLine(1,1,70,80);
}
}
public class Demo
{
public static void main(String[] args)
{
t f = new t ();
f.setBounds(300,200,600,400);
f.setVisible(true);
}
}
不过这种画图方式不被动吗?因为是在建立对象时自动调用的paint()方法。
总结起来:就是关于Graphics类 产生对象的问题。
------解决方案--------------------
用一个方法就要了解一个方法的特性,何况你遇到错误了还不仔细研究一下那个方法
下面是Javadoc关于这个方法的介绍
Creates a graphics context for this component. This method will return null if this component is currently not displayable.
写得很清楚了,当component当前没有显示的时候,会返回null
所以你要先setVisible
还有一个问题,如果你只是drawLine画一次,那你是看不到效果的,因为窗体是不断重绘的,也就是内容是不断清空的,如果要看到效果,你就要不断的drawLine,像下面这样,但这样的做法是不好的,正确的应该是重写paint方法。
Frame f = new Frame();
f.setSize(400, 300);
f.setVisible(true);
Graphics g = f.getGraphics();
while (true) {
g.drawLine(1, 1, 100, 100);
}