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

本文深入解析Java Panel中super.paint(g)函数的使用,解释其如何影响图像绘制过程,以及不使用该函数时导致的问题。通过代码示例展示了在不同情况下super.paint(g)对图像绘制的影响。

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面板),再画直线的,所以直线没有被覆盖。




评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值