画图小工具第二篇

一、事件源

事件源是一个事件的起点。所有的容器组件类和元素组件类可以成为事件源对象。在程序中可以有多个事件,也就是可以有多个事件源。由需要实现的功能,达到的目的来确定事件源。在程序中动作发生在哪里,哪个就是事件源。

二、事件监听方法:

由事件源来确定事件监听方法。

三、事件接口:

由事件接口实现事件监听方法,而事件接口不能实例化。所以靠定义一个事件处理来,来实现接口中的抽象方法。

四、本次任务:

实现曲线、刷子、橡皮、喷枪

(在窗体上按下鼠标按键、然后拖动鼠标,在按下和拖动之间绘制曲线)

五、实现步骤:

  1. 确定事件源:窗体。
  2. 事件监听方法:addMouseListener (MouseListener l)监听鼠标按下的动作;

addMouseMotionListener(MouseMotionListener l)监听鼠标拖动的动作

3.事件接口:MouseListener,MouseMouseListener。

在上一篇的基础上实现曲线、刷子、橡皮、喷枪。

(1):

  private Graphics2D g1;// 声明一个画布类的对象;Graphics2D是Graphics的一个子类。

六、代码:

(一):LoginListener.java

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

 */
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.Random;

//F3键可以看到代码
public class LoginListener implements MouseListener, ActionListener, MouseMotionListener {

    public String s;

    private int X1, X2, Y1, Y2;// 声明四个整数变量,用来记录按下和释放时的坐标值

    public int sx,sy,ex,ey;//存储任意多边形的起始点坐标和结束点的坐标
    public int count=0;//记录画的是任意多边形的第几条线

    Graphics g;// 声明一个画笔画布类的对象名
    // 向DrawFrame借画笔画布类的对象。
    // public JButton butLine ;
    // public JButton butSquare;
    // public JButton butRotundity;不需要用到方法和属性,所以不用声明对象。
    // public JButton butS;
    private Graphics2D g1;// 声明一个画布类的对象;Graphics2D是Graphics的一个子类。
    BasicStroke S = new BasicStroke(10);
    BasicStroke C = new BasicStroke(1);// 方法一:实例化画笔粗细。设置画笔粗细为1.

    public void SetG(Graphics gra) {
        g = gra;// 把gra给g;
        g1 = (Graphics2D) gra;// 强制转型

        g1.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        // 设置设置画笔抗锯齿,使线条更加平滑。
    }

    // public void SetJ(JButton jb){
    // butLine=jb ; 没有用到对象的方法或者属性就不用传。
    // butSquare=jb;
    // butRotundity=jb;
    // butS=jb;
    // }
    /**
     * 当你在事件源上发生鼠标按下动作时执行的方法。
     */

    public void mousePressed(MouseEvent e) {
        // 取得鼠标按下时取得的坐标;
        X1 = e.getX();
        Y1 = e.getY();

    }

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

        X2 = e.getX();
        Y2 = e.getY();

        if (s.equals("直线")) {

            g.drawLine(X1, Y1, X2, Y2);

        }
        if (s.equals("圆")) {

            g.drawOval(X1, Y1, X2, Y2);
        }
        if (s.equals("矩形")) {
            g.drawRect(X1, Y1, X2, Y2);

        }
        if (s.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) {

    }

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

    public void mouseClicked(MouseEvent e) {
        if (s.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 actionPerformed(ActionEvent e) {
        // 得到按钮上的文字;
        s = e.getActionCommand();

        // getActionCommand()的方法是ActionEvent的,也就是e的。

    }

    @Override // 当鼠标拖动时,在事件源上按下鼠标按键然后拖动鼠标时执行的方法。
    public void mouseDragged(MouseEvent e) {
        if (s.equals("画笔")) {
            /**
             * 因为在拖动过程当中会不断取点,如果起点固定则画出来的都是在一个点开始的。
             * 以上一个拖动取到的坐标作为下一段直线的起点,从而画出曲线。
             */

            X2 = e.getX();
            Y2 = e.getY();
            g1.drawLine(X1, Y1, X2, Y2);
            X1 = X2;// 转换坐标。
            Y1 = Y2;

        }
        if (s.equals("刷子")) {

            g1.setStroke(S);// 要进行转换画笔,再画;设置线条的粗细。
            X2 = e.getX();
            Y2 = e.getY();
            g1.drawLine(X1, Y1, X2, Y2);
            X1 = X2;
            Y1 = Y2;
            g1.setStroke(C);

        }
        if (s.equals("橡皮擦")) {
            g1.setStroke(S);
            g1.setColor(Color.WHITE); // 设置线条的颜色为白色来绘制橡皮擦。
            X2 = e.getX();
            Y2 = e.getY();
            g1.drawLine(X1, Y1, X2, Y2);
            X1 = X2;
            Y1 = Y2;
            g1.setColor(Color.black);// 在画完之后转换回一般的格式就可以不用在每个都设置。粗细也是。
            g1.setStroke(new BasicStroke(1));// 设置粗细法二。

        }
        if (s.equals("喷枪")) {
            g1.setStroke(C);
            X2 = e.getX();
            Y2 = e.getY();

            Random rand = new Random();// 实例化一个随机数类的对象
            int size = rand.nextInt(50) + 20;// 随机决定要画的点数,size的范围在20到69之间。没有“+20”时,只有0到49之间
            for (int i = 0; i < size; i++) {
                int x = rand.nextInt(8);// 在0到7之间随机取点。
                int y = rand.nextInt(8);
                g1.drawLine(X2 + x, Y2 + y, X2 + x, Y2 + y);// 有随机数来改变坐标,在X2,Y2附件画点。
            }

            g1.setColor(Color.black);
            g1.setStroke(C);

        }

    }

    @Override
    /*
     * 当在事件源上移动鼠标时执行的方法。
     */
    public void mouseMoved(MouseEvent e) {

    }

}

(二)DrawFrame.java

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

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.text.AbstractDocument.Content;

/**
 * 定义一个画图界面类,该类继承自JFrame窗体类.
 */
public class DrawFrame extends JFrame {

    /**
     * 程序入口主函数
     */
    public static void main(String[] args) {
        // 实例化窗体类的对象,调用初始化界面的方法
        DrawFrame dl = new DrawFrame();
        dl.initUN();
        // dl.setBackground(Color.WHITE);这个是错误的不能改变窗体的颜色。

    }

    public void initUN() {
        setTitle("简单画图");
        setSize(600, 500);
        setDefaultCloseOperation(3);
        setLocationRelativeTo(null);
        setLayout(new FlowLayout());
        JButton butLine = new JButton("直线");
        this.add(butLine);
        JButton butSquare = new JButton("矩形");
        add(butSquare);
        JButton butRotundity = new JButton("圆");
        add(butRotundity);
        JButton butS = new JButton("任意多边形");
        add(butS);
        JButton but = new JButton("画笔");
        add(but);
        JButton butt = new JButton("刷子");
        add(butt);
        JButton but1 = new JButton("橡皮擦");
        add(but1);
        JButton but2 = new JButton("喷枪");
        add(but2);
        getContentPane().setBackground(Color.WHITE);//getContenPane为 改变窗口的颜色。

        /**
         * //实例化一个流失布局类的对象,布局类是针对容器的,容器上要填多个组件,那么必须要设置排列对齐方式;
         * java.awt.FlowLayout fl=new java.awt.FlowLayout();
         * jf.setLayout(fl);//设置窗体的布局方式为流式布局 //定义一个ImageIcon类,该类用来读取一个磁盘的图片文文件。
         */

        setVisible(true);

        Graphics g = getGraphics();// 获取窗体上画笔画布对象(注意:必须要在窗体可见之后才能获取画笔画布对象,否则获取的是null)

        // 4.在DrawFrame类中实例化LoginListener事件处理类的对象dn;
        LoginListener dn = new LoginListener();
        addMouseListener(dn);// 5.给事件源窗体对象添加addMouseListener()鼠标监听方法,指定事件处理类对象dl.
        addMouseMotionListener(dn);
        butLine.addActionListener(dn);// 要加监听方法才能获取数值。
        butSquare.addActionListener(dn);// 要加监听方法才能获取数值。
        butRotundity.addActionListener(dn);// 要加监听方法才能获取数值。
        butS.addActionListener(dn);// 要加监听方法才能获取数值。
        but1.addActionListener(dn);

        but.addActionListener(dn);
        butt.addActionListener(dn);
        but2.addActionListener(dn);

        dn.SetG(g);

        // dl.SetJ(butS);
        // dl.SetJ(butRotundity);
        // dl.SetJ(butSquare);
        // dl.SetJ(butLine);

    }

}

七:注意点

g1 = (Graphics2D) gra;// 强制转型子类到父类是强制转型;父类到子类是自动转型;
设置线条的颜色为白色来绘制橡皮擦。(原来想的是把取到的数据归零但是发现画不了。)
因为在拖动过程当中会不断取点,如果起点固定则画出来的都是在一个点开始。以上一个拖动取到的坐标作为下一段直线的起点,从而画出曲线。

Random rand = new Random();// 实例化一个随机数类的对象
int size = rand.nextInt(50) + 20;// 随机决定要画的点数,size的范围在20到69之间。没有“+20”时,只有0到49之间
for (int i = 0; i < size; i++) {
int x = rand.nextInt(8);// 在0到7之间随机取点。
int y = rand.nextInt(8);
g1.drawLine(X2 + x, Y2 + y, X2 + x, Y2 + y);// 有随机数来改变坐标,在X2,Y2附件画点。八:运行结果 

 
时间: 2024-08-07 20:58:10

画图小工具第二篇的相关文章

画图小工具第一篇

一.知识点 (一)实现画图程序所需要的APT类: import java.awt.Color; import java.awt.FlowLayout; import java.awt.Graphics; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.text.AbstractDocument.Content; /** * 定义一个画图界面类,该类继承自JFrame窗体类. */ public c

我的微信小程序第二篇

在上一篇<我的微信小程序第一篇(入门)>中,很多人问我什么是微信小程序,在这里我要说一下这个是我的失误啦,我默认大家都知道微信小程序,其实可能行内人士都知道小程序,好多非行内朋友可能平时不太关注这些,所谓的隔行如隔山,所以,我今天简单介绍下什么是微信小程序? 据说在微信产品经理张小龙的微信朋友圈中介绍到(敲黑板,重点是“据说”噢,因为我没有张小龙微信,哈哈): 小程序是一种不用下载安装即可使用的应用,它实现了应用“触手可及”的梦想,用户扫一扫或者搜索一下即可打开,也体现了“用完即走”的理念,用

串口数据画图小工具

1.SerialChart 预览 配置文件 [_setup_] port=COM5 baudrate=57600 width=1000 height=200 background_color = white grid_h_origin = 100 grid_h_step = 10 grid_h_color = gray grid_h_origin_color = black grid_v_origin = 10 grid_v_step = 10 grid_v_color = gray grid_

小学期——第二篇

这三天我们依次制作了新增.查询.修改和删除四大功能. 新增:首先需要设想当我们点此按钮时,应新开一个窗口,以供我们填写新增信息.所以,我们首先要创建一个CustSaveAction类. 代码: 1 package com.crm.action; 2 3 import com.crm.bean.Cust; 4 import com.crm.service.CustService; 5 import com.opensymphony.xwork2.ActionSupport; 6 7 public

改变GPS速度的小工具——第二版

补充上一版:实现随机生成速度值,完成替换并且写入文件 import randomdef chang_velocity() : with open('befor.gps' ,'r') as f,open('after.gps' ,'a') as f1: for line in f: data = line.strip().split(',') for i in line : #遍历文件行数 velocity = str(round(random.uniform(0, 50), 6))#将产随机到的

绘图小工具-工厂模式设计

工厂模式:不提供一个统一的工厂类来创建所有的对象,而是针对不同的对象提供不同的工厂,每个对象都有一个与之对应的工厂 . 绘图小工具类图: 使用工厂模式降低了类之间的耦合,可以方便地增删绘图的功能. 功能包括:画方.画圆.画折线.画曲线.绘制中和绘制后有颜色差异. 主框架: import JavaDraw.factory.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionList

Android开源项目第二篇——工具库篇

本文为那些不错的Android开源项目第二篇——开发工具库篇,主要介绍常用的开发库,包括依赖注入框架.图片缓存.网络相关.数据库ORM建模.Android公共库.Android 高版本向低版本兼容.多媒体相关及其他. Android开源项目系列汇总已完成,包括: Android开源项目第一篇——个性化控件(View)篇 Android开源项目第二篇——工具库篇 Android开源项目第三篇——优秀项目篇 Android开源项目第四篇——开发及测试工具篇 Android开源项目第五篇——优秀个人和

微信开发第二篇:工具篇

自从写了第一篇后,最近一直在整理另一个项目的需求,没有继续研究下去,今天晚上终于开始了我的第二篇. 本次微信的项目是想基于H5做的,所以现在的想法还是先从前端入手. 要做一个移动端H5的网站有很多种方式: 1.使用Html5.css3.js自己从头开始做. 但如果这样,对于目前主要从事项目管理及后端开发工作的我,无疑是困难重重:另外自己也已经对前端的东西很久没碰过了.如果选择这种方式,肯定会本末倒置.最后说不定整个项目都没得戏(虽说这个项目完全是自己的个人爱好!!) 2.使用现在已有的移动端H5

kubernetes之CI/CD工具jenkins第二篇,helm的使用

1. kubernetes之CI/CD第二篇-jenkins结合helm部署应用: 1. 概述: ?? 在前期的博文中我已经初步介绍过kubernetes环境下的CI/CD的使用.主要是jenkins slave pod自动创建和销毁,当有jenkins job任务执行的时候,就会自动创建一个jenkins slave pod.在本篇博文中,我们将介绍jenkins生成slave pod的另外一种方法,就是在pipeline脚本里面定义slave pod的镜像等,同时将Dockerfile.Je