为什么要重写paint方法?
当我们使用JFrame创建出窗体时,遇到窗体的尺寸改变(ie.拉伸窗体),或者窗体的部分像素被移动到屏幕之外,都会导致窗体的刷新。窗体有一个系统自带的刷新方法。但这时如果窗体中有此前绘制出的图像,则图像会随窗体的刷新而消失,这时候我们就需要将绘制图像的方法重写入JFrame的paint方法中,让图像随窗体的刷新而同步再次被绘制出来。
实现方式
函数要在类继承JFrame或者JPanel两个属性下才能实现重写,并且这个方法是系统自动调用的。
重写绘制方法的本质是将图像数据化、对象化。将图像的属性(eg. 坐标、颜色、图形类型……)和其绘制方法写入paint()。
样例:
public class DrawPad extends JFrame{
Graphics g;
public static void main(String[] args) {
new DrawPad();
}
// 初始化一个窗体界面
public DrawPad() {
this.setTitle("图形绘制");
this.setSize(800,700);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);// 可视化
}
//在窗体被改变状态时自动调用 刷新
int count=0;
@Override
public void paint(Graphics g) { //绘制容器
super.paint(g); //调用父类的paint方法
count++;
System.out.println("paint"+count); //窗体刷新时显示 paint+次数
g.setColor(Color.YELLOW);
g.drawLine(100, 100, 500, 100);
g.fillRect(200, 100, 300, 100);
g.drawRect(200, 200, 300, 100);
g.drawOval(200, 200, 300, 100);
}
}
使用动作监听器手动刷新
这里要用到一个repaint()使窗体重绘,监听器写法:
public class Listener implements ActionListener {
DrawPad drawPad;
// 构造方法 --
/**
* 创建对象时调用
* @param drawPad
*/
public Listener(DrawPad drawPad) {
// TODO Auto-generated constructor stub
this.drawPad = drawPad; //构造方法传值,使用监听器时传入其对象
}
@Override
public void actionPerformed(ActionEvent e) {//对动作事件e执行如下刷新动作
// TODO Auto-generated method stub
drawPad.repaint();// 刷新
}
}