说一说JAVA中paint(Graphics g)和repaint();

paint方法的用法:首先在Java文件中的第一个类要继承Jframe或者JPanel;然后再写一个构造方法进行初始化窗口,通过main方法调用该构造方法;最后通过paint方法进行画图。


前言

提示:

函数要在类继承JFrame或者JPanel两个属性下才能实现重写paint(Graphics g)方法,运行paint(Graphics g)方法有3种情况:
1.系统自动调用
2.this.setVisible(true)时会调用。
3.调用repaint()后,也会去执行paint(Graphics g)

JFrame、JPanel类都有自己的方法,而paint就是他们的方法,而且继承的paint方法在程序运行的时候会自动调用。

不去继承的话,paint方法是自己新写的属于当前类的方法,所以程序运行时并不会自动去调用paint方法。所以总的来说如果不去继承,就画不了东西。


一、使用步骤

1.使用说明:

paint方法的正确用法:

(1)新建的.java文件里边的第一个类继承(extends)Jframe(容器)或者JPanel(轻量级容器)

(2)写一个构造方法,进行初始化窗口(大小、位置、可见、关闭等)。

(3)写一个main方法调用构造方法。

(4)写一个paint方法进行画图,方法前边加@Override。

2.上代码

写一段安装上面要求的JAVA代码
代码如下:

package com.it;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
public class Hello extends JFrame{
	public static void main(String[] args) {
		new Hello();
	}
	public Hello() {
		this.setTitle("paint方法");
		this.setSize(400,400);
		this.getContentPane().addMouseListener(new mouseProcassor());
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLocationRelativeTo(null);
		this.setVisible(true);
	}
	int count=0;//记录调用paint的次数
	@Override
	public void paint(Graphics g) {
		g.setColor(Color.YELLOW);//设置画笔颜色
		super.paint(g);//清除画面内容,(刷新屏幕)防止所有的字都重叠在一起
		System.out.println("第"+(++count)+"次执行paint方法");
		g.setFont(new Font("微软雅黑",Font.BOLD,30));//设置窗口中文字的字体,格式,大小
		g.drawString("第"+(count)+"次打印HELLO", 100, 150);
	}
	
	int countRepaint=0;//记录使用repaint的次数
	public class mouseProcassor extends MouseAdapter{
		public void mouseClicked(MouseEvent e) {
			if(e.getButton()==e.BUTTON3) {
				System.out.println("第"+(++countRepaint)+"次执行repaint方法");
				repaint();
			}
		}
	}
}

上面的代码可以直接执行。并得到下面的图像。

在这里插入图片描述
注意看图片中paint执行的次数。在this.setVisible(true);就去执行了2次paint(Graphics g)方法。(其中有一次应该是系统调用的)


接下来,我们在窗口内右击一次鼠标看看什么结果:

在这里插入图片描述
控制台中打印的结果为:
第1次执行repaint方法
第3次执行paint方法

简单分析一下:
右击鼠标后会去运行repaint(),然后就去调用paint(Graphics g)。所以会执行repaint方法第一次,而paint方法已经是第三次被执行。


总结

如果你写的程序是动画效果时,repaint后上一帧的图像不会自动被清除,而是跟下一帧图像重叠。也就说明他的父类对象Frame可以完成工作(刷新屏幕)没有做。
所以,我们要先调用其父对象也就是java.awt.Frame的paint方法,
super.paint(Graphics g);
这样就OK了.

下面这副图就是没有使用super.paint(Graphics g);的结果。

在这里插入图片描述
可以看到,显示次数的地方已经看不清了。
如有疑问,可在下方留言,问题如果比较多,可能会出更详细的讲解。

  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值