1.实现画图程序所需的API类

JFrame

JButton

ActionListener              动作事件接口

ActionEvent                        动作事件对象类

获取按钮上的文字或者获取事件源对象 getActionCommand();

MouseListener                  鼠标事件接口

MouseEvent                       鼠标事件对象类              获取发生动作的坐标值

Graphics                     画笔画布类                       提供绘制图形的方法

2.界面实现

DrawFrame extends JFrame

3.功能实现

在窗体上按下鼠标按键,然后释放鼠标按键,在按下和释放的两点之间绘制一条直线。

事件机制

1.事件源对象:窗体对象

2.事件监听方法:addMouseListener(MouseListener l);

3.事件接口(事件处理类):MouseListener   接口不能实例化对象,需要定义类实现接口,这个类就是事件处理类。

实现步骤:

1.新建一个DrawListener事件处理类,该类实现MouseListener鼠标事件接口,实现接口中的抽象方法。

2.定义四个整数类型类型变量,用来存储按下和释放动作的坐标值。

3.定义一个Graphics画笔画布类的对象名,调用绘制图形的方法。

你要在哪一个组件上绘制图形,那么你的画笔画布对象就从这个组件上获取。

在窗体上绘制图形,那Graphics就要窗体上获取。

4.在DrawFrame类中实例化DrawListener事件处理类的对象dl;

5.给事件源窗体对象添加addMouseListener()鼠标监听方法,指定事件处理类对象dl.

4.练习

画直线,矩形,任意多边形和圆

注意:任意多边形的要求是

1  先画第一条线,即g.drawLine(x1,y1,x2,y2);

2  用sx,sy,ex,ey分别存储第一条线的起始点和结束的点

3判断如果是双击,则闭合图形;如果不是双击则绘制图形

a  如果是双击:先获取点击的坐标值(x,y),再用g.drawLine(ex,ey,x,y)和 g.drawLine(ex,ey,x,y)去绘制闭合的图形,当然还需要将count=0,使得闭合之后还能绘制新的任意多边形;

b  如果不是双击,则把(ex,ey)作为下一条直线的起始点,用(ex,ey,x,y)绘制新的直线,接下来把x的值赋给ex,y的值赋给ey,则(x,y)就是另外一条直线新的起点了。

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

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());
JButton butLine = new JButton("直线");
add(butLine);
JButton butSharp = new JButton("矩形");
add(butSharp);
JButton butAngle = new JButton("任意多边形");
add(butAngle);
JButton butHair = new JButton("圆");
add(butHair);
setVisible(true);
//获取窗体上画笔画布对象(注意:必须要在窗体可见之后才能获取画笔画布对象,否则获取的是null)
Graphics g = getGraphics();
//4.实例化DrawListener事件处理类的对象,对象名dl
drawListener dl = new drawListener();
//5.给事件源窗体对象添加addMouseListener()鼠标监听方法,指定事件处理类对象dl.
addMouseListener(dl);
//调用画图Graphics
dl.setGraphics(g);
//按钮的动作监听,按钮是事件源,也就是说只有当按下按钮才会执行画图的动作,可以参考登录界面的验证登录
butLine.addActionListener(dl);
butSharp.addActionListener(dl);
butAngle.addActionListener(dl);
butHair.addActionListener(dl);

}
}

package wenya529;

import java.awt.BasicStroke;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
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.geom.Point2D;

/**
* 1.新建一个DrawListener和ActionListener事件处理类,该类实现MouseListener鼠标事件实现和ActionListener接口,实现接口中的抽象方法。
*/
public class drawListener implements MouseListener, ActionListener {
private int x1, y1, x2, y2;// 声明四个整数变量,用来记录按下和释放时的坐标值
public int sx,sy,ex,ey;//存储任意多边形的起始点坐标和结束点坐标
public int count=0;//记录画的是任意多边形的第几条线

private Graphics g;// 声明一个画笔画布类的对象名
private String type;

// 向DrawFrame借画笔画布类的对象
public void setGraphics(Graphics gra) {
//g = gra;// 把gra传给drawFrame中的g
g = (Graphics2D) gra;//强制转型
//设置画笔抗锯齿
((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);

}

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

public void mouseClicked(MouseEvent e) {
x1= e.getX();
y1 = e.getY();
x2= e.getX();
y2 = e.getY();
((Graphics2D) g).setStroke(new BasicStroke(5));
if (type.equals("圆")) {
// 调用绘制圆的方法
g.drawOval(x1,y1,x2,y2);
}

if (type.equals("矩形")) {

g.drawRect(x1,y1,x2,y2);
}
if(type.equals("任意多边形")&&count!=0){//判断是否已经画完任意多边形的第一条线了
//获取点击的坐标值
int x = e.getX();
int y = e.getY();
if(e.getClickCount()==2){//判断是双击,图形要闭合
//使用x,y和ex,ey画闭合的第一条线
g.drawLine(ex, ey, x, y);
//使用x,y和sx,sy画闭合的第一条线
g.drawLine(sx, sy, x, y);
//改变count的值,好让下一次又是重新开始新的多边形
count=0;
}
else{//判断不是双击,要画接下来的线
//根据上一条线的结束点和当前点击的坐标,来绘制直线
g.drawLine(ex, ey, x, y);
//将当前这条线的结束赋给ex,ey,作为下一条线的起始点
ex = x;
ey =y;
}
}

}

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

/**
* 当你在事件源上发生鼠标释放动作时执行的方法。
*/
public void mouseReleased(MouseEvent e) {
// 记录释放的坐标值O
x2 = e.getX();
y2 = e.getY();

if (type.equals("直线")) {
// 调用绘制直线的方法
g.drawLine(x1, y1, x2, y2);

}
if (type.equals("任意多边形")&&count==0) {//判断是否画任意多边形的第一条线
g.drawLine(x1, y1, x2, y2);
//存储第一条线的起始点
sx=x1;
sy=y1;
//存储第一条线的结束点
ex=x2;
ey=y2;
count++;//表示第一条线已经画完了
}
}

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

}

/**
* 当你的鼠标离开到事件源是行时执行的方法。
*/
public void mouseExited(MouseEvent e) {
}
//实现ActionListener的抽象方法
public void actionPerformed(ActionEvent e) {
type = e.getActionCommand();// ActionCommand获取按钮上的文字或者获取事件源对象
}

}

运行结果:

java画图之初体验的更多相关文章

  1. Apache Beam入门及Java SDK开发初体验

    1 什么是Apache Beam Apache Beam是一个开源的统一的大数据编程模型,它本身并不提供执行引擎,而是支持各种平台如GCP Dataflow.Spark.Flink等.通过Apache ...

  2. 阿里云部署Java web项目初体验(转)/linux 上配置jdk和安装tomcat

    摘要:本文主要讲了如何在阿里云上安装JDK.Tomcat以及其配置过程.最后以一个实例来演示在阿里云上部署Java web项目. 一.准备工作 购买了阿里云的云解析,和云服务器ecs. 2.下载put ...

  3. 阿里巴巴 Java 开发规约插件初体验

    阿里巴巴 Java 开发手册 又一次来谈<阿里巴巴 Java 开发手册>,经过这大半年的版本迭代,这本阿里工程师们总结出来避免写出那么多 Bug 的规范,对于 Java 开发者简直就是必备 ...

  4. 阿里云部署Java web项目初体验(转)

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了如何在阿里云上安装JDK.Tomcat以及其配置过程.最后以一个实例来演示在 ...

  5. java的多线程初体验

    这里以车站售票作为模拟场景,多个票务人员同时出售某一列高铁(G250?)的车票,售票的基本保证有2点: 1.不能售出多于预定限额的车票. 2.不能售出具有相同座位的车票. 初学java,有不当的地方各 ...

  6. java -ui自动化初体验

    本文来讲一下ui自动化的环境搭建,以及最初级的打开网页操作 说起ui自动化,想想大概是前年的时候我开始接触和学习的吧,怎么说呢无论是pc还是app,ios还是android,确实很神奇而且很华丽,但是 ...

  7. 阿里云部署Java web项目初体验

    林炳文Evankaka原创作品. 转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了怎样在阿里云上安装JDK.Tomcat以及其配置过程. 最后以一个实例来演 ...

  8. 【阿里云产品公测】消息队列服务MQS java SDK 机器人应用初体验

    [阿里云产品公测]消息队列服务MQS java SDK 机器人应用初体验 作者:阿里云用户啊里新人   初体验 之 测评环境 由于MQS支持外网访问,因此我在本地做了一些简单测试(可能有些业余),之后 ...

  9. protobuf(Protocol Buffers)java初体验

    因为项目须要所以简单的研究了下protobuf.我也是參照网上的博客,所以大部分内容我也就不反复造轮子了.首先protobuf介绍点击这里,使用介绍点击这里,使用demo看这里. 我个人的第一个样例也 ...

随机推荐

  1. 【原+转】创建CocoaPods私有podspec

    在我的上一篇文章<iOS 手把手教你发布代码到CocoaPods>中着重介绍如何将自己的代码索引添加到公开的CocoaPods中,当你需要主动地向大众开源你的代码时需要那么做.但在现实中我 ...

  2. 使用FragmentTabHost+TabLayout+ViewPager实现双层嵌套Tab

    大多数应用程序都会在底部使用3~5个Tab对应用程序的主要功能进行划分,对于一些信息量非常大的应用程序,还需要在每个Tab下继续划分子Tab对信息进行分类显示. 本文实现采用FragmentTabHo ...

  3. (五)Maven目录结构及常用命令说明

    前面提到的部分知识有涉及到Maven目录结构与Maven常用的一些命令,在这里专门给大家做个简单的介绍. 1.Maven目录结构说明 Maven总体目录结构如下图: bin目录:该目录包含了mvn运行 ...

  4. 通过Ajax使用FormData对象无刷新上传文件

    写在前面:本文说的这个方案有浏览器兼容性问题:所有主流浏览器的较新版本已经支持这个对象了,比如Chrome 7+.Firefox 4+.IE 10+.Opera 12+.Safari 5+,对兼容性比 ...

  5. YourSQLDba设置共享路径备份

    YourSQLDba可以将数据库备份到网络路径(共享路径),这个也是非常灵活的一个功能,以前一直没有使用过这个功能,最近由于一个需求,于是我测试了一下YourSQLDba备份到网络路径,中间遇到了一些 ...

  6. iOS 10 的坑:新机首次安装 app,请求网络权限“是否允许使用数据”(转)

    症状 iOS 10 之后,陆陆续续地有用户联系我们,说新机第一次安装.第一次启动的时候,app 首屏一片空白,完全没数据.kill 掉重新打开就好了. 一开始以为是用户网络情况不好,但随着越来越多的用 ...

  7. linux yum 工具

    vim /etc/yum.repos.d/CentOS-Base.repo 编辑yum 源网址 yum list |grep vim查看vim 情况 yum remove 卸载rpm包 # yum u ...

  8. C++ 用宏实现swap(a,b)

    #include <iostream> using namespace std; #define SWAP(a,b) a^=b,b^=a,a^=b int main(void){ int ...

  9. WIN 下的超动态菜单(三)代码

    WIN 下的超动态菜单(一)简介 WIN 下的超动态菜单(二)用法 WIN 下的超动态菜单(三)代码 作者:黄山松,发表于博客园:http://www.cnblogs.com/tomview/ 超动态 ...

  10. Linux--shell脚本之正则表达式

    一.正则表达式的概念及特点: 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑.规 ...