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 stub
new 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 stub
new Test();
}
}
运行结果:
如果将Mypan类中paint(g)函数中的super.paint(g)注释掉,结果为:
仅仅画了线,却没有把contenpan上加的this(contenpan.add(this))面板组件画上去。就是没有super.paint(g)的缘故。
我曾经有这样一个疑问:为什么this所代表的面板加在了contenpan面板上,为什么没有将contenpan面板上所画的线覆盖住。
原因是画线语句在super.paint(g)的后面,他是先画contenpan面板(包含this面板),再画直线的,所以直线没有被覆盖。