注释很详细,直接上代码
上一篇
Look here~
听我说完再继续看更容易理解:
如果说用之前的绘图方法写一个绘画板你会怎么做?重绘会让之前的内容消失呀,用各种数据结构记录每个像素点的位置或颜色?嘶,感觉很麻烦对吧。位图便解决了这个问题,相当于给你一个图层进行绘画,画完每一步都会实时显示在绘画区域,这样就实现了像素点的记录。下面来实践一下~
新增内容
1. 使用位图记录绘画痕迹
2. 继承Canvas类,重写paint方法显示位图
3.鼠标移动响记录上次与当此位置进行连线化曲为直
4.处理鼠标左键刚按下时没有上一次坐标的情况
5.特判鼠标右键的菜单响应情况
package swing21_30;import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;public class swing_test_22 {private Frame frame =new Frame("手绘程序");//定义画图区的宽高private static final int WIDTH = 600;private static final int HEIGHT = 600;//记录鼠标上一次拖动过程中的位置private int prex=-1;private int prey=-1;//定义一个右键菜单,用于设置画笔的颜色private PopupMenu colorMenu=new PopupMenu("");private MenuItem redItem=new MenuItem("红色");private MenuItem greenItem=new MenuItem("绿色");private MenuItem blueItem=new MenuItem("蓝色");//定义一个变量记录当前画笔颜色private Color forceColor=Color.BLACK;//创建一个BufferImage对象,用于绘制图形private BufferedImage image=new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_RGB);//TYPE_INT_RGB表示使用RGB颜色模型//通过位图,获取关联的Graphics对象Graphics g=image.getGraphics();//自定义一个类,继承Canvas类,重写paint方法class MyCanvas extends Canvas{@Overridepublic void paint(Graphics g){g.drawImage(image,0,0,null);//绘制图片}}//创建一个画图区MyCanvas drawArea=new MyCanvas();public void init(){//组装视图//创建监听器ActionListener listener=new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {//获取控件文本String actionCommand=e.getActionCommand();switch (actionCommand){case "红色":forceColor=Color.RED;break;case "绿色":forceColor=Color.GREEN;break;case "蓝色":forceColor=Color.BLUE;break;}}};//注册监听器redItem.addActionListener(listener);greenItem.addActionListener(listener);blueItem.addActionListener(listener);//组装菜单colorMenu.add(redItem);colorMenu.add(greenItem);colorMenu.add(blueItem);//将菜单设置给绘图区域drawArea.add(colorMenu);//鼠标抬起响应drawArea.addMouseListener(new MouseAdapter() {@Overridepublic void mouseReleased(MouseEvent e) {//特判触发右键菜单的情况boolean popupTriggered=e.isPopupTrigger();if(popupTriggered){//显示右键菜单colorMenu.show(drawArea,e.getX(),e.getY());}//重置prex和prey的值prex=-1;prey=-1;}});//设置背景为白色g.setColor(Color.WHITE);g.fillRect(0,0,WIDTH,HEIGHT);//通过鼠标移动监听器drawArea.addMouseMotionListener(new MouseAdapter() {@Overridepublic void mouseDragged(MouseEvent e) {//获取当前鼠标位置int x=e.getX();int y=e.getY();if(prex!=-1&&prey!=-1){g.setColor(forceColor);//根据鼠标拖动的距离,绘制线条g.setColor(forceColor);g.drawLine(prex,prey,x,y);};//修正prex和prey的值prex=e.getX();prey=e.getY();//因为在位图上完成了但是还未显示在绘图区,这里需要刷新一下绘图区//刷新绘图区drawArea.repaint();}});//设置最佳大小drawArea.setPreferredSize(new Dimension(WIDTH,HEIGHT));frame.add(drawArea);//设置最佳大小且可见frame.pack();frame.setVisible(true);}public static void main(String[] args) {new swing_test_22().init();}
}
演示效果:
右键显示颜色选项