我用的画布是jPanel,是不是跟我重载paint方法有关啊,我重载的是frame的paint来重画,是不是应该重载画布的paint啊,可是我重载画布的paint不知道为什么老执行不到

解决方案 »

  1.   

    老兄,首先得明确一个问题。
    不管你在哪里画图,最终都得通过 Graphics 来实现。
    就算在 JPanel 上画图,也是用的 Graphics 来画的啊。你自己想想,重载的 paint 方法,不就有一个 Graphics 的参数吗?至于位置,就看你想画在哪里了。如果你希望在画布大小改变的时候,那是一定要重载 paint 或者其它用于绘制的方法的,比如 paintComponent,当然,得看情况。
      

  2.   

    重载画布的paint的话,会不会调用的太频繁了,我重载了画布的validate()好像我的东西就画不出来了
      

  3.   

    你的layout不要设置成flowlayout,这样它就不会将位置随便调整,与graphics的画图方法没有关系,现在的画图工具都是通过graphics,Graphics2D来画图的,与panel,frame无关!
      

  4.   

    Graphics g = panel.getGraphics() 
    这样画的图才是在panel 里, 否则是在frame上的
      

  5.   

    我用的是borderLayout,在画布大小变化的时候就会错乱,
    我的Graphics是canvas.getGraphics()得到的
      

  6.   

    用Graphics 绘制使用2D API画出的图形,Graphics 从什么对象获得,那用2D API画的图形就在什么容器内显示
    http://sunfruit.blogchina.com,这里有例子和源代码
      

  7.   

    你说的位置不对了,应该不存在这样的问题,Graphics 重绘是要获得坐标,不管容器怎么变,坐标应该不会变的
      

  8.   

    楼主所有的绘制都是以绝对大小绘制的,不是以相对大小绘制的,所以出现这个问题很正常
    比如你想画条线,长度是你窗口的宽度的一半,你当前窗口大小600,400
    你应该
    g.drawLine(0,0,0+getSize().getWidth()/2,0);
    你用
    g.drawLine(0,0,300,0);自然会出问题了
      

  9.   

    g.drawLine(0,0,(int)(0+getSize().getWidth()/2),0);
      

  10.   

    我的画布是canvas类继承的jpanel类
    图形是shape类写的shape的g是在初始化shape的时候从canvas中获得的(g = canvas.getGraphis())
    在需要重画的时候,好像只能调用frame的paint()才有效,paint方法如下:
    {super.paint(g);
     canvas1.drawAllShapes();//自己写的方法
    }
    这时候在改变canvas的大小的时候,图形有时候就会出到画布的外面去了,而且位置和我记在内存中的不一样了
      

  11.   

    加个componentresized监听,或者每次repaint的时候按size()重新计算一下
      

  12.   

    给你推荐一个好方法,你可以确定一个坐标,当你改变窗口大小的时候,触发一个event,clean屏幕,然后repaint,但是这次需要你修改整个屏幕的画出的物体的坐标如果不在窗口里面,就不要显示,但是要存储位置就可以了如果一个点一个点的话,则很类似图形学的clip了
      

  13.   

    如果继承JPanel,应该调用paintComponent()这个方法,这个是专对JPanel的。JFrame是顶层的容器,一般初始化以后就不用repaint(),任何需要repaint()都可以用JPanel来做啊。把JPanel加到JFrame里就可以了。我的个人想法。