java实现简易画板(写字)

学到按键监听,故想到了鼠标监听,以此记录下过程,简易作品勿喷。

原理

监听鼠标,获取鼠标运动坐标,历史坐标都存入一个容器中,一个坐标画个圆,每次绘画,把所有坐标的圆画出来,就看起来形成笔画了

Version1.0

1.Writer extends JFame 初始化框体
2.MyPanel extends JPanel implent implements MouseListener
3.存储X Y?于是想到了HashMap,好像还要有顺序?(总不能写个小字先出现了中间部分吧,好像画得很快,也看不出是从哪里画起的),那再来个LinkedhashMap;

Version1.0问题

画不了笔画可是看完那四个方法好像都实现不了

Version1.1

查手册发现个MousemotionListener

Version1.1问题

当画到横坐标相同的笔画时,之前的消失了。
原理,Map接口下的子类是不允许有重复值的。

怎么办呢? 既要有顺序,由要有X,Y ,我可以将XY封装到一个对象里不就行吗

Version2.0

将数据的存储改为ArraysList 而且查询用的多

想画完再画?

再class MyPanel extends JPanel implements MouseMotionListener, KeyListener
监听到特定键就清空ArraysList再重绘就之前的字没有啦

Version2.0问题

清空之后总是还有一个点。
还有鼠标移动过快,笔画会断层
在这里插入图片描述

Version3.0搜了下资料,有很多做画板的

看到他们画的曲线是由drawline而来的,试了下,由于我之前都是把
鼠标拖拽的点都存到ArraysList里面,而drawline需要两个点,本想用迭代器两个while获得两个点的坐标的,结果一堆运行错误,至于用for ArraysList数组长度,两个两个取出来,效果如下
在这里插入图片描述
还是有断层

想到之前有篇文章将,曲线就是有许多微小直线构成,即不断画首尾相连的直线,改了下代码(之前是两个两个对象划线,现在是头一个对象是上一条直线的第二个对象)
works 成功了
在这里插入图片描述

Version4.0

线的连续解决了,可是换一笔画,会导致上一笔画的尾连接到新笔画的头
由于我最初的方案是把拖到的点都放到ArraysList里面,不能区别整个数组那两个对象点是换笔画的两个点(至少我觉得很难发现这两个点在哪里)

看的那篇文章是添加监听对象时使用的是匿名内部类的,也没有用到数组,就是只要鼠标拖动前得到两个点就绘画,后来的绘画并不会覆盖前面的,
但是它也有我刚刚说的换笔画问题,关键在于它把两个笔画的尾和头连起来了,文章原址:https://www.cnblogs.com/huchangqing/p/8996410.html
我的解决方案,每次开始笔画都会鼠标按下,那么mousepressed记录按下的坐标,做为起点,这样就不会拿上个笔画的尾作为起点了
works 成功
在这里插入图片描述

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.util.*;


public class Writer extends JFrame {
    private MyPanel mp5;

    public static void main(String[] args) {
        new Writer();
    }

    public Writer() {
        mp5 = new MyPanel();
        this.add(mp5);
        this.setSize(700, 700);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
        this.addMouseMotionListener(mp5);  //鼠标监听
        this.addKeyListener(mp5);//键盘监听
    }
}

class MyPanel extends JPanel implements MouseMotionListener, KeyListener {

    int x = 0;
    int y = 0;
    //private HashMap<Integer, Integer> XY = new LinkedHashMap<>();
    ArrayList<Coor> coors = new ArrayList<Coor>();

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        coors.add(new Coor(x, y));
        Iterator<Coor> iterator = coors.iterator();
        while (iterator.hasNext()) {
            Coor next = iterator.next();
            g.fillOval(next.X,next.Y,15,15);
            System.out.println("=================" + next.X + " "+next.Y);
        }
    }
    @Override
    public void mouseDragged(MouseEvent e) {
        x = e.getX() - 15;
        y = e.getY() - 45;
        this.repaint();
        System.out.println("鼠标在拖动" + e.getY() + " " + e.getY());
    }
    @Override
    public void mouseMoved(MouseEvent e) {
    }
    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_R){
            coors.clear();
            x=0;
            y=0;
            this.repaint();
        }
        System.out.println((char) e.getKeyCode() + "按键按下");
    }
    @Override
    public void keyTyped(KeyEvent e) {
    }
    @Override
    public void keyReleased(KeyEvent e) {
    }
}
class Coor {
    public int X;
    public int Y;

    public Coor(int x, int y) {
        X = x;
        Y = y;
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 画板UI设计(总体布局) (1)创建窗体并设置相关属性; (2)给整个窗体添加一个中间容器用来覆盖整个窗体; (3)设置边框布局,因为整个画板大致为左边部分,中间部分,菜单栏三个部分,用边框布局比较合适; (4)给窗体添加左面板,中间面板; (5)给左面板添加按钮,并设置按钮图片和效果; (6)给左面板添加左子面板,用来存放颜色按钮; 2.画板功能设计 (1)给左画板中的按钮组中的每个按钮添加鼠标监听器; (2)点击不同按钮,绘制不同的图形; (3)给左子面板中的每个颜色按钮添加鼠标监听器; (4)根据下面板中选中的颜色按钮,来获取按钮的背景颜色,并将该颜色设置成画笔的颜色; (5)铅笔功能 1、铅笔是鼠标拖动时画的线,所需要实现鼠标移动监听器,我们采用一个类来实现多个接口; 2、添加新的鼠标监听器类; 3、在鼠标移动时间中实现画笔的逻辑(其实就是绘制直线,鼠标每移动一个像素,就会触发移动事件,通过移动事件获取鼠标的坐标,与上一次移动的坐标连线就可以了; (6)刷子功能 刷子其实就是加粗的画笔,画出来的直线更粗,这里需要用到Graphic2D画笔来设置画笔的粗细。 (7)橡皮擦功能 橡皮擦就是把画笔颜色设置成相同的背景颜色就可以了,拖动鼠标时进行擦除,所以在鼠标拖动事件中编写。 (8)喷桶功能 1、定位方法:鼠标拖动事件实现; 2、随机数生成:Random; 3、实现原理,在鼠标拖动附近绘制很多的原点; 3. 画板的保存和重绘的设计 (1)给我们的画板添加菜单条、菜单以及菜单项 (2)给每个菜单项添加监听器 (3)点击不同的菜单项实现相应的功能 (4)图形保存功能:利用对象输出流,将容器对象写入文件; (5)打开图形功能:利用对象输入流,将容器对象读入,然后将容器里面的图形对象在画板上绘制出来 (6)新建文件功能:新建文件,将画板上绘制的内容清空(清空之前可以确认是否需要进行保存)清屏(重绘)功能依次方法; (7)文件保存格式为BMP格式; (8)文字功能:读取文本框中的文本并打印到屏幕鼠标的相应的响应位置,传入输入的文字大小的参数,以此来改变文字的大小; 4.弹泡泡功能的设计 根据Java多线程来实现弹泡泡功能;泡泡的位置颜色随机出现,并且做到碰到边框会变色;

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值