zoukankan      html  css  js  c++  java
  • JFrame中的paint()方法

    看下面的代码,

    public class super_paint extends JFrame{
        private JButton jt;
        public super_paint()
        {
            jt=new JButton("Hello");
            jt.setSize(20,10);
              
            Container container=getContentPane();
            this.add(jt);
            
        }
        @Override
        public void paint(Graphics g) {
            // TODO Auto-generated method stub
            super.paint(g);
            g.setColor(Color.red);
            g.draw3DRect(10,10,100,100,true);
            g.setColor(Color.green);
            g.fillOval(50,10,60,60);
             g.drawString("A myFrame object", 10, 50 );
        }
    
    
    }

    测试类如下:

    public class super_paint_Test {
        public static void main(String[] args)
        {
            JFrame t=new super_paint();
            t.setSize(300,300);
            t.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             
            t.setVisible(true);
        }    
    
    }

    是显示时只会显示按钮,不会显示我们paint方法中的所画的内容,当窗口尺寸改变时就会调用paint()方法就可以看得我们paint()方法中的内容

    我们把构造函数 public super_paint() 中的内容去掉后,paint()方法中的内容运行时就可以显示正常了。

    Java中每次重绘都会调用paint方法。 

    public void paint(Graphics g) {
        //
    super.paint(g);
        Color c 
    = g.getColor();
        g.setColor(
    new Color(50,150,50));
        g.fillOval(tankPos.x, tankPos.y, tankWid, tankHei);
        g.setColor(c);
    }

    如果使用awt包里面的Frame类来构建窗口的话,上面的方法没有问题,但如果用他的子类swing里的JFrame的话,每次重绘,只是重绘窗口边框和paint方法里的东西,窗口的背景并没有被绘制出来,所以会看到窗口里显示的是下一层窗口里要显示的东西,是“透明”的。而且,如果你写的程序是动画效果时,repaint后上一帧的图像不会自动被清除,而是跟下一帧图像重叠。也就说明他的父类对象Frame可以完成工作(刷新屏幕)没有做。
    所以,我们要先调用其父对象也就是java.awt.Frame的paint方法,
    super.paint(Graphics g);
    这样就OK了.
    或者,我们也可以手工在paint里加上刷新屏幕的代码:
    g.setColor(this.getBackground());
    g.fillRect(0, 0, 窗口宽,窗口高);

    可以进一步参看http://www.dreamincode.net/forums/topic/80369-what-does-the-superpaintcomponentg-do/

    http://www.360doc.com/content/07/0911/13/7635_735929.shtml

    http://wenwen.soso.com/z/q238340956.htm

  • 相关阅读:
    Java io流 之file类(文件和文件夹)
    异常处理
    封装
    面向对象与类
    包与模块的使用
    模块
    递归函数
    迭代器
    装饰器
    函数基础2
  • 原文地址:https://www.cnblogs.com/youxin/p/2711216.html
Copyright © 2011-2022 走看看