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);//改变背景颜色的命令
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;// 把gra传给drawFrame中的g
((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) {
type = e.getActionCommand();// ActionCommand获取按钮上的文字或者获取事件源对象
}

}

时间: 2024-08-29 12:53:15

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

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

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

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

在之前写了一篇blog:java画图程序_图片用字母画出来 主要是把一些调试的截图发布出来,现在程序调试我认为可以了(当然,你如果还想调试的话,也可以下载源码自己调试). 就把源码发布出来. 项目结构: 资源文件: 原图:http://images.cnblogs.com/cnblogs_com/hongten/356471/o_imagehandler_resource.png 运行效果: 原图:http://images.cnblogs.com/cnblogs_com/hongten/356

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

最近在研究怎样将图片用字母在文本编辑工具中“画”出来. 你看了这个可能还不知道我想说什么? 我想直接上图,大家一定就知道了 第一张:小猫 原图:http://www.cnblogs.com/hongten/gallery/image/143365.html 第二张:林允儿 原图:http://images.cnblogs.com/cnblogs_com/hongten/356471/o_star.png 第三张:郭静 原图:http://www.cnblogs.com/hongten/galle

Java画图

//利用awt.Graphics画图 //Graph用于显示所要画的图型 //Shape的子类定义可以图形 //要改变图形,可以利用Graphics类提供的方法实现 //要在同一窗口显示更多图形,通过重载paint()实现. import java.awt.Graphics; import javax.swing.JFrame; import javax.swing.JPanel; public class Graph extends JPanel { /** * */ private stat

java画图之初体验

1.实现画图程序所需的API类 JFrame JButton ActionListener              动作事件接口 ActionEvent                        动作事件对象类 获取按钮上的文字或者获取事件源对象 getActionCommand(); MouseListener                  鼠标事件接口 MouseEvent                       鼠标事件对象类              获取发生动作的坐标值

[Java画图]画函数图像

利用Graphics类画任意显式函数图像,只需修改代码中的F()函数即可,另外调整timesx和timesy参数来分方向放大或缩小图像.需要重定义坐标系. 1 package test; 2 3 import javax.swing.*; 4 import java.awt.Graphics; 5 6 public class DrawFunction extends JFrame { 7 static double timesx = 10, timesy = 10; 8 double F(do

Java学习入门 -04-类(画图案例)

类的基本概念 类是现实世界抽象为数据集合的一种表达工具,在程序中我们把类作为数据.及数据操作的容器,是一种自定义数据类型. 类具有类型本身的属性,也具有实例属性.类变量和实例变量都叫成员变量,类变量也叫静态成员变量(static修饰符标志):类方法和实例方法都叫成员方法,类方法也叫静态方法(static修饰符标志).实例也是实际的例子,类似"int a"咱们就叫做变量a是类型int的实例化. 最后上一个 Java画图的代理 主函数如下: import javax.swing.JFram

画图工具之优化篇

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; /** * 1.新建一个LoginListener事件处理类, * 该类实现M

JAVA入门到精通-第33讲-绘图技术.坦克大战1

    用的是Access数据库,安全性不够好,性能也不够强大:   躲在这里,坦克很少过来,做了一个随机数: 把得分的记录保存在数据库里面: SQLServer2005中型数据库:    (x,y)坐标:     800x600:     表示计算机屏幕上的每一行由800个点组成,共有600行:   共有480000个像素:   java绘图技术:   绘图一般在JPane上画: 覆盖JPanel的paintat方法 Graphics是一个图形画笔类,绘图的重要类,可以理解为一只画笔 supe