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);的结果。
可以看到,显示次数的地方已经看不清了。
如有疑问,可在下方留言,问题如果比较多,可能会出更详细的讲解。