前言:
我当时写一个作业程序,为了搞明白这个问题,看了很多大佬的文章。之后,我结合自己实践时的体会与认识,决定写这篇文章。希望对大家有用。
关于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);//可视化
}
}//主函数