Java项目之画图板(二)

原创 2017年01月03日 10:41:31

画图板(二)

在上一个版本中,我们把所有的功能都写在一个类里面,这样有很多缺点,第一,不符合Java面向对象的思想,第二,代码都在一个类里面,不方便管理;在这个版本中,我们将对上一个版本进行代码重构,将每个功能模块抽出来,单独的形成一个类,优点是将功能分开,每个类的职责明确,提高协同效率,方便排错


我们将原来的一个类重构为四个类,主要是GrawBoard类(主要负责将每个功能模块整合到一个窗体中),PanelBottom类(底部面板,主要负责画笔颜色的设置),PanelLeft类(左边面板主要负责画笔应该画什么图形的选择),PanelCenter类(中间面板,主要负责画笔画图形)


  1. GrawBoard类
public class DrawBoard extends JFrame {

    Graphics2D graphics = null;// 创建一个画笔

    public DrawBoard() {

        // 第一步:设置窗体属性
        setFrameParams();// 窗体属性

        // 第二步:添加组件
        PanelLeft panelLeft = new PanelLeft(null);// 左边面板
        this.add(panelLeft, BorderLayout.WEST);
        PanelCenter panelCenter = new PanelCenter(panelLeft, null);// 中间面板
        this.add(panelCenter, BorderLayout.CENTER);
        PanelBottom panelBottom = new PanelBottom(panelLeft, null);// 底部面板
        this.add(panelBottom, BorderLayout.SOUTH);

        // 第三步:设置窗体可见
        this.setVisible(true);

        // 获得画笔
        graphics = (Graphics2D) panelCenter.getGraphics();
        panelLeft.graphics = graphics;
        panelCenter.graphics = graphics;
        panelBottom.graphics = graphics;
    }

    /**
     * @Description 设置窗体属性
     */
    public void setFrameParams() {
        // 设置窗体的属性
        this.setTitle("画图板");
        this.setSize(600, 400);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(3);
        this.setLayout(new BorderLayout());// 布局
    }
}

2、PanelLeft类

public class PanelLeft extends JPanel {
    String currentCommand = "line";// 获取当前点击的是哪一个按钮
    Color currentColor = Color.black;// 用于还原画笔颜色
    int count = 0;// 记录多边形图形是不是画第一笔
    Graphics2D graphics = null;

    public PanelLeft(Graphics2D g) {

        this.graphics = g;// 给画笔赋值
        // 左边面板
        this.setPreferredSize(new Dimension(70, 400));
        this.setBackground(Color.white);

        String[] value = { "star", "dot_rect", "eraser", "fill", "color_picker", "magnifier", "pencil", "brush",
                "airbrush", "word", "line", "curve", "rect", "polygon", "oval", "round_rect" };

        // 添加一些画图按钮组件

        // 创建监听器
        ActionListener actionListener = new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                currentCommand = e.getActionCommand();// 获取当前按钮标识,命令
                count = 0;// 当切换成其他组件的时候矩形第一笔还原
                graphics.setColor(currentColor);// 还原画笔的颜色
            }
        };
        for (int i = 0; i < value.length; i++) {
            JButton btnIcon = new JButton(new ImageIcon("images/" + value[i] + ".jpg"));
            btnIcon.setPreferredSize(new Dimension(24, 24));
            // btn.setBorderPainted(false);
            this.add(btnIcon);
            btnIcon.addActionListener(actionListener);// 添加事件
            btnIcon.setActionCommand(value[i]);// 给按钮一个标识,命令,用来区分这些按钮
        }

    }
}

3、PanelCenter类

public class PanelCenter extends JPanel {

    // 画直线等图形的起始坐标
    int xStart = 0;
    int yStart = 0;
    // 终止坐标
    int xEnd = 0;
    int yEnd = 0;

    Graphics2D graphics = null;// 创建一个画笔

    public PanelCenter(PanelLeft panelLeft, Graphics2D g) {
        this.graphics = g;// 给画笔赋值
        // 创建鼠标监听器
        MouseListener mouseListener = new MouseListener() {
            int xFirstStart = 0;// 记录起始坐标
            int yFirstStart = 0;
            int xCurrentStart = 0;// 记录当前起始坐标
            int yCurrentStart = 0;

            @Override
            public void mouseReleased(MouseEvent e) {
                // 释放鼠标
                xEnd = e.getX();
                yEnd = e.getY();

                // 确定图形
                switch (panelLeft.currentCommand) {

                case "line":
                    // 直线
                    graphics.drawLine(xStart, yStart, xEnd, yEnd);
                    break;
                case "curve":
                    // 曲线
                    break;
                case "rect":
                    // 矩形
                    graphics.drawRect(Math.min(xStart, xEnd), Math.min(yStart, yEnd), Math.abs(xEnd - xStart),
                            Math.abs(yEnd - yStart));
                    break;

                case "polygon":
                    // 多边形
                    if (panelLeft.count == 0) {
                        xFirstStart = xStart;// 保存起始坐标
                        yFirstStart = yStart;

                        xCurrentStart = xEnd;// 保存当前起始坐标
                        yCurrentStart = yEnd;

                        graphics.drawLine(xStart, yStart, xEnd, yEnd);
                        panelLeft.count++;
                    }

                    break;
                case "oval":
                    // 椭圆
                    graphics.drawOval(Math.min(xStart, xEnd), Math.min(yStart, yEnd), Math.abs(xEnd - xStart),
                            Math.abs(yEnd - yStart));
                    break;
                case "round_rect":
                    // 圆角矩形
                    graphics.drawRoundRect(Math.min(xStart, xEnd), Math.min(yStart, yEnd), Math.abs(xEnd - xStart),
                            Math.abs(yEnd - yStart), Math.abs(xEnd - xStart) / 10, Math.abs(yEnd - yStart) / 10);
                    break;
                }
            }

            @Override
            public void mousePressed(MouseEvent e) {
                // 按下了鼠标
                xStart = e.getX();
                yStart = e.getY();

                if (!("brush".equals(panelLeft.currentCommand) || "eraser".equals(panelLeft.currentCommand))) {
                    // 还原画笔宽度
                    graphics.setStroke(new BasicStroke(1));
                }
                if ("brush".equals(panelLeft.currentCommand) || "eraser".equals(panelLeft.currentCommand)) {
                    // 设置橡皮擦和刷子的宽度
                    graphics.setStroke(new BasicStroke(10));
                }
                if ("eraser".equals(panelLeft.currentCommand)) {
                    // 橡皮擦
                    graphics.setColor(Color.white);
                }
            }

            @Override
            public void mouseExited(MouseEvent e) {
                // 移开了鼠标
            }

            @Override
            public void mouseEntered(MouseEvent e) {
                // 进入了
            }

            @Override
            public void mouseClicked(MouseEvent e) {

                // 鼠标点击了
                if ("polygon".equals(panelLeft.currentCommand)) {
                    int clickCount = e.getClickCount();
                    if (clickCount == 1 && panelLeft.count == 1) {
                        // 点击一下
                        graphics.drawLine(xCurrentStart, yCurrentStart, xEnd, yEnd);
                        xCurrentStart = xEnd;
                        yCurrentStart = yEnd;
                        // System.out.println("单击");
                    } else if (clickCount == 2 && panelLeft.count == 1) {
                        // 点击两下
                        graphics.drawLine(xCurrentStart, yCurrentStart, xFirstStart, yFirstStart);
                        panelLeft.count = 0;
                        // System.out.println("双击");
                    }
                }
            }
        };

        // 创建鼠标拖动监听器
        MouseMotionListener mouseMotionListener = new MouseMotionListener() {

            @Override
            public void mouseMoved(MouseEvent e) {
                // 移动鼠标(鼠标不按下的移动)
            }

            @Override
            public void mouseDragged(MouseEvent e) {
                // 拖拽鼠标(鼠标左键按下时的移动)

                if ("pencil".equals(panelLeft.currentCommand)) {
                    // 铅笔

                    graphics.drawLine(xStart, yStart, e.getX(), e.getY());
                    xStart = e.getX();
                    yStart = e.getY();

                } else if ("airbrush".equals(panelLeft.currentCommand)) {
                    // 喷枪
                    Random random = new Random();
                    for (int i = 0; i < 30; i++) {
                        int randomX = random.nextInt(10) - 5;
                        int randomY = random.nextInt(10) - 5;
                        graphics.drawLine(e.getX() + randomX, e.getY() + randomY, e.getX() + randomX,
                                e.getY() + randomY);
                    }

                } else if ("brush".equals(panelLeft.currentCommand)) {
                    // 刷子
                    graphics.drawLine(xStart, yStart, e.getX(), e.getY());
                    xStart = e.getX();
                    yStart = e.getY();

                } else if ("eraser".equals(panelLeft.currentCommand)) {
                    // 橡皮擦
                    graphics.drawLine(xStart, yStart, e.getX(), e.getY());
                    xStart = e.getX();
                    yStart = e.getY();
                }
            }
        };
        // 中间面板
        this.setBackground(Color.white);
        this.addMouseListener(mouseListener);// 鼠标点击事件
        this.addMouseMotionListener(mouseMotionListener);

    }
}

4、PanelBottom类

public class PanelBottom extends JPanel {

    Graphics2D graphics = null;// 创建一个画笔

    public PanelBottom(PanelLeft panelLeft, Graphics2D g) {

        this.graphics = g;// 给画笔赋值

        this.setPreferredSize(new Dimension(this.getWidth(), 70));// 设置面板大小

        // 设置默认颜色
        Color[] colors = { Color.black, Color.blue, Color.cyan, Color.DARK_GRAY, Color.gray, Color.green,
                Color.lightGray, Color.magenta, Color.orange, Color.pink, Color.RED, Color.WHITE, Color.yellow };

        ActionListener actionListener = new ActionListener() {
            // 添加按钮监听器
            @Override
            public void actionPerformed(ActionEvent e) {
                String actionCommand = e.getActionCommand();
                int i = Integer.valueOf(actionCommand);
                graphics.setColor(colors[i]);
                panelLeft.currentColor = graphics.getColor();// 获取画笔当前颜色,用于还原画笔颜色
            }
        };
        for (int i = 0; i < colors.length; i++) {
            JButton btnColor = new JButton();
            btnColor.setBackground(colors[i]);// 设置按钮的背景颜色
            btnColor.setPreferredSize(new Dimension(30, 30));// 设置按钮的大小
            btnColor.addActionListener(actionListener);// 添加事件
            btnColor.setActionCommand(i + "");// 设置每个按钮的标识,命令
            this.add(btnColor);// 将按钮添加到面板

        }

    }
}
版权声明:本文为博主原创文章,转载请注明出处

Java项目之画图板(一)

画图板(一) 此画图板为第一个版本的画图板,下一个版本将会说明这个版本的缺点和不足,下一个版本为画图板(二) 1、步骤 第一步. 创建一个窗体(布局设为BorderLayout)第二步. 布局左边...
  • c_87_84
  • c_87_84
  • 2016年12月29日 14:22
  • 305

Java项目之画图板(三)

在上一个版本中即画图板(二)中,我们进行了代码重构,将一个类重构成了几个类,每个类负责一个模块,在这个版本中,我们主要解决一些bug和不足需要解决的问题 窗体在改变大小的时候,在比原先窗体大的那部分画...
  • c_87_84
  • c_87_84
  • 2017年01月05日 00:59
  • 207

SDTU(3374) 数据结构实验之查找二:平衡二叉树

数据结构实验之查找二:平衡二叉树 Time Limit: 400ms   Memory limit: 65536K   题目描述 根据给定的输入序列建立一棵平衡二叉树,求出建立的平...
  • zheng__jun
  • zheng__jun
  • 2016年08月18日 20:15
  • 500

数据结构实验之排序二:交换排序

数据结构实验之排序二:交换排序 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 冒泡...
  • guoqingshuang
  • guoqingshuang
  • 2015年12月20日 18:55
  • 1697

SDUT 3333 数据结构实验之栈六:下一较大值(二)

点击打开题目链接 #include using namespace std; struct node { int data;//当前数值 int Id;//标记当前数值Id所在,若...
  • zhidetian
  • zhidetian
  • 2016年07月20日 11:08
  • 562

Maven之(二)Maven生命周期

我们在开发项目的时候,不断地在编译、测试、打包、部署等过程,maven的生命周期就是对所有构建过程抽象与统一,生命周期包含项目的清理、初始化、编译、测试、打包、集成测试、验证、部署、站点生成等几乎所有...
  • u012152619
  • u012152619
  • 2016年05月22日 02:09
  • 4364

基础系列之《画图板实现》

转载请注明出处:王亟亟的大牛之路各类自定义View大多都是画+动画实现的,所以这一次讲点基础的,画!!先列举下画2D画相关的2个大哥大:Paint Canvas.贴一下常用的方法(人家那里扣来的)具体...
  • ddwhan0123
  • ddwhan0123
  • 2015年09月29日 11:33
  • 1938

数据结构实验之栈与队列六:下一较大值(二)oj

数据结构实验之栈与队列六:下一较大值(二) Time Limit: 150MS Memory Limit: 8000KB Problem Description 对于包含n(1 ...
  • sdut_jk17_zhangming
  • sdut_jk17_zhangming
  • 2018年01月20日 16:08
  • 39

Java小程序之高级画板重绘篇II

Java小程序之高级画板重绘篇II 前言:前面我们利用不同的产生不同类,每画一个相应的图形,产生一个相应的图形的对象,并利用容器把对象存储起来,取出对象时,我们需要判断取出来的是什么对象,利用in...
  • BlueSky_USC
  • BlueSky_USC
  • 2016年11月17日 14:48
  • 3754

MyBatis学习(二)--走进MyBatis的世界

mybatis是个持久层的框架,用来执行数据库操作的,无外乎增删改查,上一节对mybatis有了宏观上的了解后,这一篇博客主要通过一个小示例来入门mybatis,先看一下要写的示例需求: 根...
  • enen199202
  • enen199202
  • 2016年08月15日 14:54
  • 252
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java项目之画图板(二)
举报原因:
原因补充:

(最多只允许输入30个字)