加上一句试试.
public void paint(Graphics g)
{
                         super.paint(g);//加上这句试试
                         g.drawRect(netpaint.count,0,25,25);                             System.out.println("MyPanel is running");
}

解决方案 »

  1.   

    而且我觉得你重载paint()方法似乎有些不妥:)
    也许应该重载paintComponent()方法.关于Swing的订制绘制,在
    <java 2 图形技术卷II Swing>这本书中有下面一段建议,也许有所帮助:(下面一段是我从书上抄下来的^_^)在SWing组件中定制绘制复杂,是因为SWing组件本身是AWT容器。下面是绘制SWing组件的一些基本原则:
    &Ugrave; 如果需要控制组件本身的绘制过程,但又想用缺省的操作来绘制该组件的边框和子组件,则重载Jcomponent.paintComponent()
    &Ugrave; 如果需要完全控制组件、其边框和其子组件的绘制过程,请重载Jcomponent.paint()方法
    &Ugrave; 在重载Jcomponent.paintComponent()方法中调用super.paintComponent()以确保UI代表获得擦除不透明组件的背景和绘制的机会
    &Ugrave; 重载paintComponent方法时,不要绘制到组件的边衬中
    &Ugrave; 在计算最小、最大和首选尺寸时,要考虑组件的边衬大小
    &Ugrave; 如果SWing在更新时闪烁,则应该确保组件是双缓存的,而不是重载其他更新的方法
      

  2.   

    &Ugrave????
    为什么我从word里边粘贴过来就成这样了,我原来可是写的1,2,3,...
    不过没有关系啦,希望不影响你理解:)
      

  3.   

    to coolskeeter(蚊子) : super.paint(g);加上这句有用~谢谢~能否解释一下为何有用?
                             
      

  4.   

    :)我也不太清楚内部的原理,不过就我所看的和我认为的说一下1.paint方法的执行过程.
      首先绘制组件(就是paintCompont()方法),然后绘制组件的边框,在绘制组件的子组件.调用的顺序确保组件擦除背景.
    2.如果组件有UI代表,则paintCompont方法调用该代表的Update方法,确保为不透明组件擦除背景,然后绘制组件.
    3.书上的建议是:在重载paintComponent方法中调用super.paintComponent 方法以擦除组件的背景(书上一直这么说:)我也就这么做了^_^.当然对于透明组件,则是不必要的.
    4.一般情况下,重载paintComponent()方法,而不是paint().尽管paint里边还会调用它.但还是看看我上面贴出来的那几条建议.(又是书上说的:)panel是不透明组件(Swing默认的好像都是不透明的),我想也许需要在绘制前,最好重新擦除背景.(注意"也许":),我自己这么想的)
      

  5.   

    作用是:调用父类的paint(g)方法。原先因为你覆盖了父类的paint(g)方法,当你拖动时MyPanel回调用paint(g)方法,如果不加super.paint(g),则只会多次调用g.drawRect(netpaint.count,0,25,25);所以会出现多个矩形。加上super.paint(g),会先调用父类方法的paint(g),它会重新绘制一个JPanel,原来的矩形就没有了,再调用g.drawRect(netpaint.count,0,25,25),画一个新的举行。
      

  6.   

    为了查看效果,我把你的这个类作了以下修改. 先屏蔽掉1,和2.
        class MyPanel extends JPanel
        {
            TestNetPaint netpaint=new TestNetPaint();
            public MyPanel()
            {
                //this.setOpaque(false); -----------> 1
            }
            public void paint(Graphics g)
            {
                //super.paint(g);--------------------> 2
                int i = (int)(Math.random()*100);------->3 
                g.drawRect(netpaint.count,i,25,25);------->4
                System.out.println("MyPanel is running");
            }
    我加了3和4,是为了每次的矩形出现在一个随机的位置,便于观察.
    这样执行,并用鼠标拖动窗口边界,以改变窗口大小.这时,很明显,几乎每次都在花一个新矩形.而你原来的现象只是在"拖动很快,很多"的情况下出现.我想主要是你画在一个固定的地方,所以一些情况并没有完全观察到.然后看如果加上2,执行正确.
    同样的,如果加上1(而不加2这句),执行好像也是正确的.这个似乎和那句
    在重载paintComponent方法中调用super.paintComponent 方法以擦除组件的背景
    比较吻合.