Java源码-简单手绘程序
2016-07-24 21:08
435 查看
使用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);
}
}
}
运行截屏:
代码如下:(摘自《疯狂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);
}
}
}
运行截屏:
相关文章推荐
- JAVA实现观察者模式
- Struts2数据传输的背后机制
- java多线程--condition条件
- Java 读取配置文件中的信息 中文乱码
- JavaServlet实现文件上传
- Java虚拟机知识整理——类加载的过程
- java学习之路 之 基本语法-程序流程控制-循环结构-嵌套循环练习题
- 深入理解Spring4框架(二)——容器
- java学习之路 之 基本语法-程序流程控制-循环结构-for 循环练习题
- myeclipse关联weblogic时提示 D:\program\weblogic is not a valid BEA WebLogic Server v10.x installation directory
- SpringMVC处理请求流程(转载)
- 【java基础】JAVA常用正则表达式
- JAVA实现单例模式
- Java 不用数组打印杨辉三角
- 坦克大战_我方坦克发射子弹
- Java Exchange企业邮件服务器 发Email
- Java方法的值传递机制
- eclipse添加安卓源码
- JavaSE学习笔记之-----数组
- Java---设计模式(单例变形)多例