本帖最后由 u014246256 于 2014-05-26 12:18:28 编辑

解决方案 »

  1.   

    用一个方法就要了解一个方法的特性,何况你遇到错误了还不仔细研究一下那个方法
    下面是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);
    }
      

  2.   

    奥奥,我试过了,和你说的一样。
    不过为什么重写paint()方法就能解决窗体重绘问题了呢。是重写paint方法就不重绘了吗?
    重绘是怎么回事呀。
    我是新手,请多多包涵。
      

  3.   

    我当时看了API 文档 不过没看懂,多谢大师指点。public Graphics getGraphics()
    为组件创建一个图形上下文。如果组件当前是不可显示的,则此方法返回 null。 返回:
    组件的图形上下文,如果其没有,则返回 null
    从以下版本开始: 
    JDK1.0 
    另请参见:
    paint(java.awt.Graphics)
      

  4.   

    Swing的机制是一个Component的外观是paint方法绘制的,然后他会反复(比如一秒60次)调用这个paint来确保UI能及时更新,这也为动画效果提供了支持,动画本来就是短时间放映多张画面形成的幻觉
    重绘指的是repaint,不论你重不重写paint方法,都会重绘的。
      

  5.   

    形象地来讲就是Graphics是一个画板,paint是一个画家,而repaint是领导,领导告诉画家,每1/60秒,先擦掉画板上原来的,再重新画一遍,这就是重绘
    重写paint的方法,就相当于,你告诉画家,不要画你原来想画的东西,我来告诉你画什么,怎么画。
    而你那样先getGraphics的方法,就相当于,你先把画板抢过来,上面有画家的画,而你自己再修改,所以要保证你的修改用户能看到,你只能和画家一样的速度或者比他更快,不然你画上去,1/60秒后就被画家擦掉了,但这依然是一种不好的做法