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. arcgis server10.2.2发布地图基础服务的具体步骤

    1.直接打开制作好的.mxd文档,比如这里: 2.打开mxd文档之后,打开菜单:file-share as -services 弹出地图发布服务的界面: 点击publish之后,耐心的等待一段时间,地 ...

  2. mac osx vi 设置tab 四个空格

    如果想永久设置那么,vi ~/.vimrc,将以下内容加到文件中 :set tabstop=4 设定tab宽度为4个字符 :set shiftwidth=4 设定自动缩进为4个字符 :set expa ...

  3. 下一代Asp.net开发规范OWIN(2)—— Katana介绍以及使用

    接上篇OWIN产生的背景以及简单介绍,在了解了OWIN规范的来龙去脉后,接下来看一下Katana这个OWIN规范的实现,并看看如何使用在我们的Web开发中. 阅读目录: 一. Katana项目的结构和 ...

  4. Linux查看设置系统时区

    关于时区的概念,其实初中地理课已经涉及,很多人都多少了解一些,可能只是细节搞不太清楚.为什么会将地球分为不同时区呢?因为地球总是自西向东自转,东边总比西边先看到太阳,东边的时间也总比西边的早.东边时刻 ...

  5. You must use the Role Management Tool to install or configure Microsoft .NET Framework 3.5 SP1

    今天在Windows Server 2008 下安装SQL SERVER 2008时,碰到如下错误: You must use the Role Management Tool to install ...

  6. JDBC API Description

    package java.sql description What the JDBCTM 4.2 API Includes Versions What the java.sql Package Con ...

  7. 优化mysql服务器

    一.使用show variables 和show status 命令查看MySQL的服务器静态参数值和动态运行状态信息. 二.可以使用 mysqld --verbose --help|more 查看某 ...

  8. XmlSerializer的使用

    关键词: XmlSerializer StreamWriter T instance 保存xml文件 代码: public static void SaveXML<T>(string xm ...

  9. C语言核心之数组和指针详解

    指针 相信大家对下面的代码不陌生: int i=2; int *p; p=&i;这是最简单的指针应用,也是最基本的用法.再来熟悉一下什么是指针:首先指针是一个变量,它保存的并不是平常的数据,而 ...

  10. 大数据系列(5)——Hadoop集群MYSQL的安装

    前言 有一段时间没写文章了,最近事情挺多的,现在咱们回归正题,经过前面四篇文章的介绍,已经通过VMware安装了Hadoop的集群环境,相关的两款软件VSFTP和SecureCRT也已经正常安装了. ...