zoukankan      html  css  js  c++  java
  • 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获取按钮上的文字或者获取事件源对象
    }

    }

    运行结果:

  • 相关阅读:
    New Skateboard
    Mike and strings
    C语言异或运算在程序设计中的妙用
    快速排序
    贪心算法
    快速排序过程分析
    深度搜索C语言伪代码
    matlab 中“newff” 函数的参数设置
    一维小波分解与去噪重构
    matlab绘图(详细)(全面)
  • 原文地址:https://www.cnblogs.com/java-7/p/5558830.html
Copyright © 2011-2022 走看看