黄页网站推广公司,建一个商城型网站,网站自动更新文章,贵州建设监理网站培训通知栏注释很详细#xff0c;直接上代码 上一篇 Look here~ 听我说完再继续看更容易理解#xff1a; 如果说用之前的绘图方法写一个绘画板你会怎么做#xff1f;重绘会让之前的内容消失呀#xff0c;用各种数据结构记录每个像素点的位置或颜色#xff1f;嘶#xff0c;感觉很麻… 注释很详细直接上代码 上一篇 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 colorMenunew PopupMenu();private MenuItem redItemnew MenuItem(红色);private MenuItem greenItemnew MenuItem(绿色);private MenuItem blueItemnew MenuItem(蓝色);//定义一个变量记录当前画笔颜色private Color forceColorColor.BLACK;//创建一个BufferImage对象用于绘制图形private BufferedImage imagenew BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_RGB);//TYPE_INT_RGB表示使用RGB颜色模型//通过位图获取关联的Graphics对象Graphics gimage.getGraphics();//自定义一个类继承Canvas类重写paint方法class MyCanvas extends Canvas{Overridepublic void paint(Graphics g){g.drawImage(image,0,0,null);//绘制图片}}//创建一个画图区MyCanvas drawAreanew MyCanvas();public void init(){//组装视图//创建监听器ActionListener listenernew ActionListener() {Overridepublic void actionPerformed(ActionEvent e) {//获取控件文本String actionCommande.getActionCommand();switch (actionCommand){case 红色:forceColorColor.RED;break;case 绿色:forceColorColor.GREEN;break;case 蓝色:forceColorColor.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 popupTriggerede.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 xe.getX();int ye.getY();if(prex!-1prey!-1){g.setColor(forceColor);//根据鼠标拖动的距离绘制线条g.setColor(forceColor);g.drawLine(prex,prey,x,y);};//修正prex和prey的值prexe.getX();preye.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();}
}演示效果 右键显示颜色选项