目标:在窗体上按下鼠标按键、然后拖动鼠标,在按下和拖动之间绘制曲线
事件机制
事件源对象:窗体
事件监听方法:addMouseListener(MouseListener l);addMouseMotionListener(MouseMotionListener l);
事件接口(事件处理类):MouseListener,MouseMotionListener

实现步骤:
1.定义DrawListener事件处理类,该类实现MouseListener和MouseMotionListener鼠标事件接口,实现接口中的抽象方法
2.实例化DrawListener事件处理类的对象,然后给事件源对象this窗体对象添加鼠标动作监听方法和鼠标移动动作监听方法。
3.在按下释放的方法中获取按下的坐标值,在拖动方法中获取拖动的坐标值,根据按下和拖动的坐标值来绘制曲线

练习
1.实现曲线、刷子、橡皮、喷枪

实现的代码如下:

/* 1.新建一个DrawListener事件处理类,该类实现MouseListener鼠标事件接口,实现接口中的抽象方法。
2.定义四个变量,在按下和释放方法中获取按下和释放的坐标值。
3.定义Grpahics画笔画布类的对象,调用绘制图形的方法来画图。
我们的组件是画出来的,那么你要在哪一个组件上画图形,那你的画笔画布对象就从这个组件上获取。
4.实例化DrawListener事件处理类的对象,对象名dl
5.给事件源窗体对象添加addMouseListener()鼠标监听方法,指定事件处理类对象dl.
*/
package wenya63;

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics;

import javax.swing.JButton;
import javax.swing.JFrame;

/**
* 定义一个画图界面类,该类继承自JFrame窗体类
*/
public class drawFrame extends JFrame {
/**
* 程序入口主函数
*/
public static void main(String[] args) {
// 实例化窗体类的对象,调用初始化界面的方法
drawFrame df = new drawFrame();
df.initUI();
}
/**
* 自定义初始化界面的方法
*/
public void initUI() {
setTitle("图画");
setSize(600, 500);
setDefaultCloseOperation(3);
setLocationRelativeTo(null);
setLayout(new FlowLayout());
getContentPane().setBackground(Color.cyan);//改变背景颜色的命令   注意:是要改变背景色,g.setColor(Color.pink)设置的是按钮框的颜色
JButton butLine = new JButton("曲线");
add(butLine);
butLine.setBackground(Color.ORANGE);
JButton butSharp = new JButton("刷子");
add(butSharp);
butSharp.setBackground(Color.ORANGE);
JButton butAngle = new JButton("橡皮");
add(butAngle);
butAngle.setBackground(Color.ORANGE);
JButton butHair = new JButton("喷枪");
add(butHair);
butHair.setBackground(Color.ORANGE);
setVisible(true);
//获取窗体上画笔画布对象(注意:必须要在窗体可见之后才能获取画笔画布对象,否则获取的是null)
Graphics g = getGraphics();
//4.实例化DrawListener事件处理类的对象,对象名dl
drawListener dl = new drawListener();
//5.给事件源窗体对象添加addMouseListener()鼠标监听方法,指定事件处理类对象dl.
addMouseListener(dl);
addMouseMotionListener(dl);
//调用画图Graphics
dl.setGraphics(g);
//按钮的动作监听,按钮是事件源,也就是说只有当按下按钮才会执行画图的动作,可以参考登录界面的验证登录
butLine.addActionListener(dl);
butSharp.addActionListener(dl);
butAngle.addActionListener(dl);
butHair.addActionListener(dl);

}
}

package wenya63;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.Random;

/**
* 1.新建一个DrawListener和ActionListener事件处理类,
* 该类实现MouseListener鼠标事件接口,MouseMotionListener和ActionListener接口,实现接口中的抽象方法。
*/
public class drawListener implements MouseListener, MouseMotionListener,ActionListener {
private int x1, y1, x2, y2;// 声明四个整数变量,用来记录按下和释放时的坐标值
private Graphics g;// 声明一个画笔画布类的对象名
private String type;

// 向DrawFrame借画笔画布类的对象
public void setGraphics(Graphics gra) {
g = (Graphics2D) gra;//强制转型

////设置画笔抗锯齿
((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);

}

/**
* 当在事件源上按下鼠标按键然后拖动鼠标时执行的方法。
*/

public void mouseDragged(MouseEvent e) {
x2 = e.getX();
y2 = e.getY();

if (type.equals("曲线")) {
g.setColor(Color.green);
// 设置线条粗细
((Graphics2D) g).setStroke(new BasicStroke(5));
g.drawLine(x1, y1, x2, y2);// 如果写成(x1,x2,y1,y2)就会使画的曲线只能是固定方向的曲线
g.setColor(Color.BLACK);//恢复原来的颜色
}
x1 = x2;
y1 = y2;
if (type.equals("刷子")) {
g.setColor(Color.pink);
((Graphics2D) g).setStroke(new BasicStroke(10));
g.drawLine(x1, y1, x2, y2);
g.setColor(Color.BLACK);//恢复原来的颜色

}
if (type.equals("橡皮")) {
//注意要先设置颜色再画
g.setColor(Color.white);
((Graphics2D) g).setStroke(new BasicStroke(30));
g.drawLine(x1, y1, x2, y2);
g.setColor(Color.BLACK);//恢复原来的颜色
}
if (type.equals("喷枪")) //难点
{
//设置线条粗细
((Graphics2D) g).setStroke(new BasicStroke(1));
Random rand = new Random();//实例化一个随机数类的对象
int size = rand.nextInt(50);//随机决定要画的点数
for(int i=0;i<size;i++)
{
//在0-7之间可以取50次
int x = rand.nextInt(8);
int y = rand.nextInt(8);

g.drawLine(x1+x, y1+y, x1+x, y1+y);//不断改变(x1,y1)的坐标值,实现在(x1,y1)的周围画点

}
}

}
/**
* Invoked when the mouse cursor has been moved onto a component but no
* buttons have been pushed.
*/
public void mouseMoved(MouseEvent e) {

}

/**
* 当你在事件源上发生鼠标点击动作时执行的方法。(在同一个位置上按下并释放才会执行点击)
*/
public void mouseClicked(MouseEvent e) {

}

/**
* 当你在事件源上发生鼠标按下动作时执行的方法。
*/
public void mousePressed(MouseEvent e) {
x1 = e.getX();
y1 = e.getY();
}

/**
* 当你在事件源上发生鼠标释放动作时执行的方法。
*/
public void mouseReleased(MouseEvent e) {

}

/**
* 当你的鼠标进入到事件源是行时执行的方法。
*/
public void mouseEntered(MouseEvent e) {

}

/**
* 当你的鼠标离开到事件源是行时执行的方法。
*/
public void mouseExited(MouseEvent e) {
}

// 实现ActionListener的抽象方法
public void actionPerformed(ActionEvent e) {//Fn+F3得知ActionListener与MouseListener, MouseMotionListener不同的
type = e.getActionCommand();// ActionCommand获取按钮上的文字或者获取事件源对象
}

}

运行结果:

java画图之曲线拖动的更多相关文章

  1. java画图程序_图片用字母画出来_源码发布_版本二

    在上一个版本:java画图程序_图片用字母画出来_源码发布 基础上,增加了图片同比例缩放,使得大像素图片可以很好地显示画在Notepad++中. 项目结构: 运行效果1: 原图:http://imag ...

  2. java画图程序_图片用字母画出来_源码发布

    在之前写了一篇blog:java画图程序_图片用字母画出来 主要是把一些调试的截图发布出来,现在程序调试我认为可以了(当然,你如果还想调试的话,也可以下载源码自己调试). 就把源码发布出来. 项目结构 ...

  3. java画图程序_图片用字母画出来

    最近在研究怎样将图片用字母在文本编辑工具中“画”出来. 你看了这个可能还不知道我想说什么? 我想直接上图,大家一定就知道了 第一张:小猫 原图:http://www.cnblogs.com/hongt ...

  4. JAVA 画图机制

    java学习脚印:深入java绘图机制 写在前面 封装性越好的类在使用时,只要清楚接口即可,而不应该让程序员了解其内部结构; 对于平常的绘图来讲,java绘图机制无需了解太多,但是朦胧容易产生错误,绘 ...

  5. java画图之初体验

    1.实现画图程序所需的API类 JFrame JButton ActionListener              动作事件接口 ActionEvent                        ...

  6. Java画图程序设计

    本文讲述一个画图板应用程序的设计,屏幕抓图如下: 『IShape』 这是所有图形类(此后称作模型类)都应该实现接口,外部的控制类,比如画图板类就通过这个接口跟模型类“交流”.名字开头的I表示它是一个接 ...

  7. Java 画图

    package com.lf.testproxy; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; i ...

  8. java画图输出到磁盘

    直奔主题,实战例子如下 package com.yuanmeng.jase; import java.awt.Color; import java.awt.Font; import java.awt. ...

  9. JAVA笛卡尔曲线

    效果图如下: import java.applet.*; import java.awt.*; public class Descartes extends Applet { int AppletWi ...

随机推荐

  1. SharePoint 2013 入门教程之创建页面布局及页面

    在SharePoint的使用过程中,页面布局和页面时很重要的两个概念,主要用于数据个性化展示,下面,我们简单介绍一下SharePoint的页面布局和页面的个性化. 一. SharePoint页面模型概 ...

  2. 在易语言中调用MS SQL SERVER数据库存储过程方法总结

    Microsoft SQL SERVER 数据库存储过程,根据其输入输出数据,笼统的可以分为以下几种情况或其组合:无输入,有一个或多个输入参数,无输出,直接返回(return)一个值,通过output ...

  3. OOP感悟

    行内讲的最多的就是出来一年内基本靠copy,一年后才基本懂得如何去写代码,而理解领悟oop,需要的时间却不定. 我工作中,我发现很多人拿着面向对相当的语言作者做着面向过程的事情,不需要知其所以然,只要 ...

  4. PS技巧:如何优雅的抠公章?

    搞设计的很苦逼,整天面对各种各样任务,除了修图.排版外,还时不时会有些另类需求.这时如果掌握一些小技巧就不用临时抱佛脚啦. 下面献上一计:教大家怎么用PS抠公章.有需要的拿去,PS:不要干坏事吆! 效 ...

  5. SLF4j:Log facade abstract

    内 容: 应用中使用slf4j的工作流程 简单示例 ILoggerFactory实例化过程 由ILoggerFactory创建Logger实例 slf4j 适配器实现 自定义适配器 slf4j 如何选 ...

  6. JVM之方法区

     基本特性: 线程共享区域,存储被JVM加载的类信息.常量.静态变量.即时编译器编译的代码等 堆的逻辑部分,不限定方法去内的内存位置和编译代码的管理策略,不限定实现垃圾回收 容量可不定也可动态扩展,不 ...

  7. Topshelf 创建windows服务注意事项

    其中项目应该是控制台应用程序 test.exe需要赋与管理员权限,右键属性可以定义. test.exe  install test.exe unstall

  8. Python学习笔记2-解析数据

    Import os; -- Python自带 print(os.getcwd()) -- 获得当前工作目录 os.chdir('/Users/longlong/Documents') -- 转换到/U ...

  9. IP分片重组的分析和常见碎片攻击 v0.2

    IP分片重组的分析和常见碎片攻击 v0.2http://www.nsfocus.net/index.php?act=magazine&do=view&mid=584 作者:yawl ( ...

  10. 3D坦克大战游戏iOS源码

    3D坦克大战游戏源码,该游戏是基于xcode 4.3,ios sdk 5.1开发.在xcode4.3.3上完美无报错.兼容ios4.3-ios6.0 ,一款ios平台上难得的3D坦克大战游戏源码,有2 ...