彭水网站建设/搜索引擎优化自然排名的优点
使用BufferedImage保存手绘图片,使用DrawCanvas作为画布,响应鼠标拖曳操作,描绘红、蓝、绿三种颜色的直线。
代码如下:(摘自《疯狂Java讲义》第11章)
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;public class HandDraw
{// 画图区的宽度private final int AREA_WIDTH = 500;// 画图区的高度private final int AREA_HEIGHT = 400;// 下面的preX、preY保存了上一次鼠标拖动事件的鼠标坐标private int preX = -1;private int preY = -1;// 定义一个右键菜单用于设置画笔颜色PopupMenu pop = new PopupMenu();MenuItem redItem = new MenuItem("Red");MenuItem greenItem = new MenuItem("Green");MenuItem blueItem = new MenuItem("Blue");// 定义一个BufferedImage对象BufferedImage image = new BufferedImage(AREA_WIDTH, AREA_HEIGHT , BufferedImage.TYPE_INT_RGB);// 获取image对象的GraphicsGraphics g = image.getGraphics();private Frame f = new Frame("简单手绘程序");private DrawCanvas drawArea = new DrawCanvas();// 用于保存画笔颜色private Color foreColor = new Color(255, 0 ,0);public void init(){// 定义右键菜单的事件监听器。ActionListener menuListener = e ->{if (e.getActionCommand().equals("Green")){foreColor = new Color(0 , 255 , 0);}if (e.getActionCommand().equals("Red")){foreColor = new Color(255 , 0 , 0);}if (e.getActionCommand().equals("Blue")){foreColor = new Color(0 , 0 , 255);}};// 为三个菜单添加事件监听器redItem.addActionListener(menuListener);greenItem.addActionListener(menuListener);blueItem.addActionListener(menuListener);// 将菜单项组合成右键菜单pop.add(redItem);pop.add(greenItem);pop.add(blueItem);// 将右键菜单添加到drawArea对象中drawArea.add(pop);// 将image对象的背景色填充成白色g.fillRect(0 , 0 ,AREA_WIDTH , AREA_HEIGHT);drawArea.setPreferredSize(new Dimension(AREA_WIDTH , AREA_HEIGHT));// 监听鼠标移动动作drawArea.addMouseMotionListener(new MouseMotionAdapter(){// 实现按下鼠标键并拖动的事件处理器public void mouseDragged(MouseEvent e){// 如果preX和preY大于0if (preX > 0 && preY > 0){// 设置当前颜色g.setColor(foreColor);// 绘制从上一次鼠标拖动事件点到本次鼠标拖动事件点的线段g.drawLine(preX , preY , e.getX() , e.getY());}// 将当前鼠标事件点的X、Y坐标保存起来preX = e.getX();preY = e.getY();// 重绘drawArea对象drawArea.repaint();}});// 监听鼠标事件drawArea.addMouseListener(new MouseAdapter(){// 实现鼠标松开的事件处理器public void mouseReleased(MouseEvent e){// 弹出右键菜单if (e.isPopupTrigger()){pop.show(drawArea , e.getX() , e.getY());}// 松开鼠标键时,把上一次鼠标拖动事件的X、Y坐标设为-1。preX = -1;preY = -1;}});f.add(drawArea);f.pack();f.setVisible(true);// 以匿名内部类的形式来创建事件监听器对象,用于关闭窗口f.addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent e){System.exit(0);}});}public static void main(String[] args){new HandDraw().init();}class DrawCanvas extends Canvas{// 重写Canvas的paint方法,实现绘画public void paint(Graphics g){// 将image绘制到该组件上g.drawImage(image , 0 , 0 , null);}}
}
运行截屏: