Java源码-简单手绘程序

使用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对象的Graphics
	Graphics 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大于0
				if (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);
		}
	}
}

运行截屏:

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值