java画图之曲线拖动
目标:在窗体上按下鼠标按键、然后拖动鼠标,在按下和拖动之间绘制曲线
事件机制
事件源对象:窗体
事件监听方法: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画图之曲线拖动的更多相关文章
- java画图程序_图片用字母画出来_源码发布_版本二
在上一个版本:java画图程序_图片用字母画出来_源码发布 基础上,增加了图片同比例缩放,使得大像素图片可以很好地显示画在Notepad++中. 项目结构: 运行效果1: 原图:http://imag ...
- java画图程序_图片用字母画出来_源码发布
在之前写了一篇blog:java画图程序_图片用字母画出来 主要是把一些调试的截图发布出来,现在程序调试我认为可以了(当然,你如果还想调试的话,也可以下载源码自己调试). 就把源码发布出来. 项目结构 ...
- java画图程序_图片用字母画出来
最近在研究怎样将图片用字母在文本编辑工具中“画”出来. 你看了这个可能还不知道我想说什么? 我想直接上图,大家一定就知道了 第一张:小猫 原图:http://www.cnblogs.com/hongt ...
- JAVA 画图机制
java学习脚印:深入java绘图机制 写在前面 封装性越好的类在使用时,只要清楚接口即可,而不应该让程序员了解其内部结构; 对于平常的绘图来讲,java绘图机制无需了解太多,但是朦胧容易产生错误,绘 ...
- java画图之初体验
1.实现画图程序所需的API类 JFrame JButton ActionListener 动作事件接口 ActionEvent ...
- Java画图程序设计
本文讲述一个画图板应用程序的设计,屏幕抓图如下: 『IShape』 这是所有图形类(此后称作模型类)都应该实现接口,外部的控制类,比如画图板类就通过这个接口跟模型类“交流”.名字开头的I表示它是一个接 ...
- Java 画图
package com.lf.testproxy; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; i ...
- java画图输出到磁盘
直奔主题,实战例子如下 package com.yuanmeng.jase; import java.awt.Color; import java.awt.Font; import java.awt. ...
- JAVA笛卡尔曲线
效果图如下: import java.applet.*; import java.awt.*; public class Descartes extends Applet { int AppletWi ...
随机推荐
- Web API初探
前几天有位同事说web api中的接口参数为对象的时候不好接收,具体什么方式我忘记了,虽然本人以前并没有接触过这方面的知识,但是据说和MVC差不多的,今天小小的研究一下,我想应该是可以的. 直接新建一 ...
- php每天一题:strlen()与mb_strlen()的作用分别是什么
strlen()与mb_strlen()都是用于获取字符串长度的,那么它们两个有什么不同? strlen()与mb_strlen()的不同之处在于mb_strlen()第二个参数可以用于指定字符编码. ...
- iOS BUG: Unbalanced calls to begin/end appearance transitions for <XXXViewController: 0x7fcea3730650>.
自定义TabBarController Push下一级Controller时 会报这样的错误:Unbalanced calls to begin/end appearance transitions ...
- java中文件的I/O操作
java中文件的读写操作 (一) (1)java中文件的字节转成字符读操作 FileInputStream fStream = new FileInputStream("test.txt&q ...
- Play Framework 完整实现一个APP(七)
1.添加验证码 Application Controller添加captcha() public static void captcha() { Images.Captcha captcha = Im ...
- ORA-39242 错误
转载: Oracle 11g Release 1 (11.1) Data Pump 技术 http://docs.oracle.com/cd/B28359_01/server.111/b28319/d ...
- CentOS7 虚拟机搭建、初始设置、简单使用
注:虚拟机安装的系统是CentOS7 1.网络设置 网络的设置主要是为了让虚拟机和物理机能够相互ping通,这样就可以用XShell之类的工具操控,也可以上网 见另一篇 CentOS7网络配置 2.物 ...
- ligerDialog的使用
1.通过ViewBag来传值. @if (ViewBag.ReturnMessage != null) 2.脚本代码: 对话框设计与赋值问题. <script type="text/j ...
- 从零自学Hadoop(03):Linux准备上
阅读目录 序 检查列表 常用Linux命令 搭建环境 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,Sou ...
- freeradius + oracle 无限认证
Radius安装配置维护文档 一.下载软件包 freeradius-server-3.0.9.tar.gz和talloc-2.1.3.tar.gz 二.配置/root目录下的.bash_profile ...