使用paint画图应加上super.paint(g)

来源:互联网 发布:matlab数据相关性分析 编辑:程序博客网 时间:2024/04/30 11:45

paint(g)函数会重绘图像,要加上super.paint(g),表示在原来图像的基础上,再画图。如果不加super.paint(g),重绘时,会将原有的绘制清空,再根据paing(g)函数绘制。

如下代码:

package aa;import java.awt.Color;import java.awt.Dimension;import java.awt.Graphics;import javax.swing.*;class Mypan extends JPanel{private static final long serialVersionUID = 1L;public Dimension d=null;public void setDimension(Dimension dim){d=dim;}public void paint(Graphics g){//super.paint(g);g.setColor(Color.GREEN);for(int i=0;i<=d.width/20;i++)g.drawLine(0+20*i, 0, 0+20*i, d.height);for(int j=0;j<d.height/20;j++)g.drawLine(0, 0+20*j, d.width, 0+20*j);}}public class Test extends JPanel{private static final long serialVersionUID = 1L;private JFrame jf=new JFrame("Test");private Mypan contenpan=new Mypan();public Test(){jf.setSize(496,498);jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jf.setContentPane(contenpan);jf.setVisible(true);contenpan.setLayout(null);contenpan.d=contenpan.getSize();contenpan.setBackground(Color.blue);}public static void main(String[] args) {// TODO Auto-generated method stubnew Test();}}
运行结果:


将super.paint(g);前的注释去掉,运行结果为:


再看看以下程序:

package aa;import java.awt.Color;import java.awt.Dimension;import java.awt.Graphics;import javax.swing.*;class Mypan extends JPanel{private static final long serialVersionUID = 1L;public Dimension d=null;public void setDimension(Dimension dim){d=dim;}public void paint(Graphics g){super.paint(g);g.setColor(Color.GREEN);for(int i=0;i<=d.width/20;i++)g.drawLine(0+20*i, 0, 0+20*i, d.height);for(int j=0;j<d.height/20;j++)g.drawLine(0, 0+20*j, d.width, 0+20*j);}}public class Test extends JPanel{private static final long serialVersionUID = 1L;private JFrame jf=new JFrame("Test");private Mypan contenpan=new Mypan();public Test(){jf.setSize(496,498);jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jf.setContentPane(contenpan);jf.setVisible(true);contenpan.setLayout(null);contenpan.d=contenpan.getSize();contenpan.setBackground(Color.BLUE);contenpan.add(this);this.setBounds(20, 20, contenpan.d.width-40, contenpan.d.height-40);this.setBackground(Color.YELLOW);}public void paint(Graphics g){super.paint(g);g.setColor(Color.RED);g.fillRect(10*20, 10*20, 60, 20);}public static void main(String[] args) {// TODO Auto-generated method stubnew Test();}}
运行结果:


如果将Mypan类中paint(g)函数中的super.paint(g)注释掉,结果为:


仅仅画了线,却没有把contenpan上加的this(contenpan.add(this))面板组件画上去。就是没有super.paint(g)的缘故。

我曾经有这样一个疑问:为什么this所代表的面板加在了contenpan面板上,为什么没有将contenpan面板上所画的线覆盖住。

原因是画线语句在super.paint(g)的后面,他是先画contenpan面板(包含this面板),再画直线的,所以直线没有被覆盖。




原创粉丝点击