关于java中paint()函数和repaint()的使用和如何清空已经绘制的图形内容

前言:

我当时写一个作业程序,为了搞明白这个问题,看了很多大佬的文章。之后,我结合自己实践时的体会与认识,决定写这篇文章。希望对大家有用。

关于paint()函数的使用:

public void paint(Graphics g)函数一个封装在java.awt.Component中的函数。其形参为一个Graphics类的对象。也就是说继承了该类的子类都可以,都可以调用和覆盖该函数。我们也可以在Frame框架和Panel容器中覆盖该函数。这个函数,无需我们去主动调用,它会被自动调用一次。我们将想画的图像写在这个函数中,编译运行程序后,这个图像就会自动显现。其实我们所说的图像绘制,都是对一个Graphics对象进行绘制。明白这点,对于初学者来说很重要。当然,我们在绘制图像之前,一般会调用父类的super.paint()函数,将页面重置一下,去除那些多余的图像内容。然后再对图像进行绘制。

	public void paint(Graphics g){
		Graphics2D gk=(Graphics2D) g;//强制转化为二维平面中的图形绘制
		int gw=60;
		for(int i=0;i<=3;i++){
			gk.drawLine(gw*i,0,gw*i,180);
		}//绘制横线
		for(int i=0;i<=3;i++){
			gk.drawLine(0,i*gw,180,i*gw);
		}//绘制竖线
		gk.drawOval(20,20,20,20);//空心圆
		gk.fillOval(80,80,20,20);//实心圆
		gk.drawLine(140,140,160,160);//短横线
	}

就像上面的代码一样,将想画的图写在里面就行。下面给出这段代码绘制图像的结果:

画出来就这样,图形内容比较简单。

关于repaint()函数的解释和多次调用paint()函数: 

其实我们对paint()函数多次调用的需求就是通过repaint()函数实现的。我们在程序中调用repaint()函数,其实就是对我们写的paint()函数再次进行调用。我第一次见这两个函数的时候,还有点懵。看了些大佬的代码和注释后,我终于明白了这个道理。

关于如何清空已经绘制的图形:

这个方法在刚才其实也有提及。就是调用父类的paint()函数,画面重新绘制一下。就是要在绘制之前将线条的颜色设置回你原本页面的颜色。父类的paint()函数,其实就很像用油漆刷墙一样,将整个页面归一为这个线条的颜色。

gx.setColor(Color.WHITE);
super.paint(gx);//清除画面内容

一个引用实例:

编写Java程序,创建一个窗体,并实现交互。在窗体内“单击鼠标左键”,在光标处绘制一个“绿圆”;窗体内“单击鼠标右键”,在光标处绘制一个“红色方框”;窗体内“双击鼠标左键”,清空所有已画“圆”和“方”。

这个题还涉及了其它方面的内容,具有一定的干扰性。对repaint()函数的调用,我写在了MouseAdapter的实现中了。

import javax.swing.JFrame;//框架
import javax.swing.JPanel;//容器
import java.awt.Event;//事件交互
import java.awt.event.*;
import java.awt.Graphics;//图形
import java.awt.Graphics2D;
import java.awt.Color;//色彩
class Mymouse extends MouseAdapter{
	public void mousePressed(MouseEvent e){
		MyJpanel ig=(MyJpanel) e.getSource();//获取事件源
		ig.x=e.getX();//获取鼠标坐标
		ig.y=e.getY();
		if(e.getButton()==e.BUTTON1&&e.getClickCount()==2){
			ig.num=3;
			ig.repaint();//重绘图形
			return ;
		}//双击左键
		else if(e.getButton()==e.BUTTON1){
			ig.num=1;
			ig.repaint();//重绘图形
			return ;
		}//单击左键
		else if(e.getButton()==e.BUTTON3){
			ig.num=2;
			ig.repaint();//重绘图形
			return ;
		}//单击右键
	}
}//监听器设置
class MyJpanel extends JPanel{
	int x,y;
	int num=0;
	public void paint(Graphics g){
		Graphics2D gx=(Graphics2D) g;
		if(num==1){
			gx.setColor(Color.GREEN);//改变画笔颜色
			gx.fillOval(x,y,20,20);//绘制圆形
		}//单击左键
		else if(num==3){
			gx.setColor(Color.WHITE);
			super.paint(gx);//清除画面内容
		}//双击左键
		else if(num==2){
			gx.setColor(Color.RED);
			gx.fillRect(x,y,20,20);//绘制方形
		}//单击右键
	}
}//容器
class MyJframe extends JFrame{
	MyJframe(){
		this.setSize(800,600);//设置框架
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);//设置关闭方式
		MyJpanel p =new MyJpanel();
		p.addMouseListener(new Mymouse());//添加监听器
		this.add(p);
	}
}//框架
public class images2 {
  public static void main (String[] args) {
  	new MyJframe().setVisible(true);//可视化
}
}//主函数

  • 26
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Javarepaint()函数用于重新绘制组件。当我们需要更新组件的外观时,可以调用repaint()函数repaint()函数会自动调用paint()函数paint()函数会重新绘制组件的外观。我们可以在paint()函数实现自己的绘制逻辑,从而实现自定义的组件外观。 以下是一个简单的Java程序,演示了如何使用repaint()函数重新绘制组件: ```java import java.awt.Color; import java.awt.Graphics; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JFrame; import javax.swing.JPanel; public class RepaintDemo extends JPanel { private int x, y; private Color color; public RepaintDemo() { color = Color.GREEN; addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { if (e.getButton() == MouseEvent.BUTTON1) { x = e.getX(); y = e.getY(); color = Color.GREEN; repaint(); } else if (e.getButton() == MouseEvent.BUTTON3) { x = e.getX(); y = e.getY(); color = Color.RED; repaint(); } else if (e.getClickCount() == 2) { x = 0; y = 0; color = Color.WHITE; repaint(); } } }); } public void paint(Graphics g) { super.paint(g); if (color == Color.GREEN) { g.setColor(color); g.fillOval(x, y, 50, 50); } else if (color == Color.RED) { g.setColor(color); g.fillRect(x, y, 50, 50); } } public static void main(String[] args) { JFrame frame = new JFrame("Repaint Demo"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(400, 400); frame.add(new RepaintDemo()); frame.setVisible(true); } } ``` 在这个程序,我们创建了一个继承自JPanel的类RepaintDemo。在RepaintDemo的构造函数,我们添加了一个MouseListener,用于监听鼠标事件。当用户单击鼠标左键时,我们记录下鼠标的位置和颜色,并调用repaint()函数重新绘制组件。当用户单击鼠标右键时,我们同样记录下鼠标的位置和颜色,并调用repaint()函数重新绘制组件。当用户双击鼠标左键时,我们将颜色设置为白色,并调用repaint()函数清空所有已画的图形。 在RepaintDemo的paint()函数,我们根据颜色绘制不同的图形。如果颜色为绿色,我们绘制一个绿色的圆形;如果颜色为红色,我们绘制一个红色的矩形。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值